2012-08-30 2 views
3

ServiceStacks CacheClient 및 Redis 라이브러리를 사용하고 있습니다. 사용자가 수행하는 특정 트랜잭션 수를 캐시하고 싶습니다. (트랜잭션이 발생했을 때) 나는 DB에 행을 추가 할 다른 작업에서 지금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; 
} 

과 : 키가 존재하지 않는 경우 나 캐시 값을 GET 또는 DB에서를 만들려면 다음을 사용하고 있습니다 Redis 카운터를 1 씩 증가시키고 싶습니다.

증가하기 전에 특정 키가 있는지 먼저 확인해야합니까? 캐시 클라이언트의 Increment 메서드가 없으면 레코드를 생성하지만이 경우 DB에 트랜잭션 레코드가 있더라도 카운터가 0부터 시작한다는 것을 알고 있습니다.

이 상황을 처리하는 적절한 방법은 무엇입니까? 키를 얻으면, null 인 경우 db를 쿼리하여 개수를 얻고이 숫자로 키를 만듭니다.

답변

2

몇 가지 참고 사항 : 당신은 키가 이미 존재하는지 확인하기 위해 EXISTS을 사용할 수 있습니다

  1. . 실제로 트랜잭션이 0 인 사용자를 캐시 할 수 있기 때문에 더 좋습니다. 이미하지 않는 의사 코드에서,

그래서 존재하는 경우

  • INCR
  • INCRBY 명령 키를 생성합니다, 여기 당신이해야 할 일이다 -

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

    당신은 또한을 실행 할 수 있습니다 INCRBY을 수행 한 직후 키에 EXPIRE 명령을 사용하면 허용되는 시간 동안 만 레코드를 캐시 할 수 있습니다.

    관련 문제