2012-08-30 36 views
3

我正在使用ServiceStacks CacheClient和Redis庫。我想緩存用戶執行的某些事務數量的計數。我使用以下命令獲取緩存值或從數據庫中創建它,如果該鍵不存在:如何使用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; 
} 

現在,在另一個操作(當交易發生時)我會添加一行到DB和我想將我的Redis計數器增加1.

我是否首先需要檢查增量前是否存在特定的密鑰?我知道如果緩存客戶端的增量方法不存在,緩存客戶端的增量方法將創建該記錄,但在這種情況下,即使數據庫中存在事務記錄,計數器也將從0開始。

處理這種情況的正確方法是什麼?獲取密鑰,如果爲空,則查詢數據庫以獲取計數並使用此數字創建密鑰?

回答

2

有幾件事情需要注意:

  1. 可以使用EXISTS來檢查,如果鍵已經存在。這樣更好,因爲您現在可以緩存實際上有0個事務的用戶。如果沒有已經存在

所以,在僞代碼

  • INCRINCRBY命令將創建密鑰,這裏是你應該做的 -

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

    您可能還需要執行EXPIRE命令在您執行INCRBY之後立即執行,因此您只能將記錄緩存一段可接受的時間。