3

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にクエリを実行してカウントを取得し、この番号でキーを作成しますか?

4

1 に答える 1

2

注意すべきいくつかのこと:

  1. EXISTSを使用して、キーがすでに存在するかどうかを確認できます。実際にトランザクションが0のユーザーをキャッシュできるようになったため、これはより優れています。
  2. INCRINCRBYキーがまだ存在しない場合は、コマンドによってキーが作成されます

だから、擬似コードでは、これがあなたがすべきことです-

if EXISTS user:<userid>:transcount
    return GET user:<userid>:transcount
else
    int transCountFromDB = readFromDB();
    INCRBY user:<userid>:transcount transCountFromDB
    return transCountFromDB

EXPIRE実行した直後にキーに対してコマンドを実行しINCRBYて、許容可能な時間だけレコードをキャッシュすることもできます。

于 2012-08-31T04:11:55.640 に答える