ServiceStacksCacheClientおよびRedisライブラリを使用しています。ユーザーが実行する特定のトランザクションの数のカウントをキャッシュしたいと思います。キャッシュされた値を取得するか、キーが存在しない場合はDBから作成するために、以下を使用しています。
public int GetTransactionCountForUser(int userID)
{
int count;
//get count cached in redis...
count = cacheClient.Get<int>("user:" + userID.ToString() + ":transCount");
if (count == 0)
{
//if it doent exists get count from db and cache value in redis
var result = transactionRepository.GetQueryable();
result = result.Where(x => x.UserID == userID);
count = result.Count();
//cache in redis for next time...
cacheClient.Increment("user:" + userID.ToString() + ":transCount", Convert.ToUInt32(count));
}
return count;
}
ここで、別の操作(トランザクションが発生したとき)でDBに行を追加し、Redisカウンターを1つインクリメントしたいと思います。
インクリメントする前に、最初に特定のキーが存在するかどうかを確認する必要がありますか?キャッシュクライアントのIncrementメソッドは、レコードが存在しない場合にレコードを作成することを知っていますが、この場合、DBにトランザクションレコードがある場合でも、カウンターは0から始まります。
この状況を処理する適切な方法は何ですか?キーを取得します。nullの場合は、dbにクエリを実行してカウントを取得し、この番号でキーを作成しますか?