2016-05-25 1 views
1

ServiceStack MemoryCacheClientを使用してDynamoDbCacheClientを使用して認証されたユーザーセッションを保存するように切り替えただけです。 ServiceStackはauth/sessionデータをexpocedとしてDynamo DBに格納しており、有効期限は正しいように見えます。servicestacksのDynamoDbCacheClientを使用している場合、古いセッションを消去する方法を教えてください

ただし、ExpiryDateに関係なく、古いセッションが削除されないという問題が強調されています。

これは想定された動作であると仮定して、提案されたアプローチが古いセッションをクリアすることになっているかどうかを尋ねます。これは、変更なしでDynamoDBのCacheEntryテーブルは大きくなります。

この設定を使用している人はいませんか?

答えて

2

ユーザーが期限切れのセッションを取得しようとすると、期限切れのセッションが決してアクセスされないと、テーブルが増加しますが、CacheEntryテーブルが大きくなる可能性があります。

あなたがしてDynamoDBのから削除することができます
var expiredIds = Dynamo.FromScan<CacheEntry>() 
    .Filter(x => x.ExpiryDate < DateTime.UtcNow) 
    .ExecColumn(x => x.Id); 

Dynamo.DeleteItems<CacheEntry>(expiredIds); 
あなたが期限切れのすべての項目のCacheEntryのIdsをフェッチするためにSCAN FilterExpressionを実行することにより、任意の有効期限が切れたエントリを削除することができ、その場合には

これは非常に一般的なクリーンアップ操作です。私は今すぐ起動時に呼び出すことができる明示的なClearExpiredEntries() API in this commitを追加しました。

var dynamoCache = new DynamoDbCacheClient(db, initSchema:true); 
dynamoCache.ClearExpiredEntries(); 
container.Register<ICacheClient>(dynamoCache); 

または、毎週、毎週など定期的なクリーンアップタスクとして実行することをお勧めします。

新しいClearExpiredEntries() APIは、v4.0.57から利用できます。現在はavailable on MyGetです。

+1

いつものように超高速応答のおかげで、私はバージョンの更新を行い、あなたの新しいメソッドに行く...それは、午前1時に1週間に1回実行される現在の一時的なflush()を打つ。 Cheers mythz –

+0

これがまだ監視されているかどうか(または誰がそれを使用しているのか)はわかりませんが、*これは問題が発生しています。これは、FromScanがDBストア全体(AWS用語では高価な操作)をスキャンし、AWSエンドからのスロットルにつながり、アプリケーションをロックアウトするためです。毎日実行すると(例えば)、その日にダイナモに書き込まれたすべてのアイテムが読み込まれます。これは割り当てられた読み取り単位を超える可能性があります。また、テーブル全体が空になっていると、書き込みが抑制される可能性があります。何かアドバイスをいただければ幸いです! –

関連する問題