如何使用ServiceStack CacheClient和Redis来递增或创建计数器

3
我正在使用ServiceStack的CacheClient和Redis库。我想缓存用户执行特定交易次数的计数。我使用以下方式获取缓存值或从数据库中创建它(如果键不存在):
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;
}

现在,在另一个操作(当事务发生时),我将向数据库添加一行,并希望将我的Redis计数器增加1。
我是否需要先检查特定的键是否存在,然后再进行递增操作?我知道缓存客户端的Increment方法会在记录不存在时创建该记录,但在这种情况下,即使数据库中有交易记录,计数器也将从0开始。
处理这种情况的正确方法是什么?获取键,如果为空,则查询数据库以获取计数并使用此数字创建键?
1个回答

2

请注意以下几点:

  1. 您可以使用EXISTS命令来检查键是否已经存在。这样做更好,因为现在您可以缓存实际上没有交易的用户。
  2. INCRINCRBY命令会在键不存在时创建该键。

所以,在伪代码中,您应该这样做 -

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

在使用INCRBY命令后,您可能还希望对键执行EXPIRE命令,以便只缓存可接受时间的记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接