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

时间:2012-08-30 22:27:27

标签: c# .net caching redis servicestack

我正在使用ServiceStacks 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;
}

现在,在另一个操作中(当事务发生时)我将向DB添加一行,我想将我的Redis计数器递增1.

在递增之前,我是否首先需要检查特定键是否存在?我知道缓存客户端的Increment方法会创建记录(如果它不存在),但在这种情况下,即使数据库中有事务记录,计数器也会从0开始。

处理这种情况的正确方法是什么?获取密钥,如果为null,则查询db以获取计数并使用此编号创建密钥?

1 个答案:

答案 0 :(得分:2)

有几点需要注意:

  1. 您可以使用EXISTS检查密钥是否已存在。这样做更好,因为您现在可以缓存实际上有0个事务的用户。
  2. INCRINCRBY命令将创建密钥(如果密钥尚不存在)
  3. 所以,在伪代码中,这是你应该做的 -

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

    您可能还想在执行EXPIRE后立即在密钥上执行INCRBY命令,这样您只能在可接受的时间内缓存记录。