2017-05-10 5 views
1

먼저 만료 라이브러리에 대한 링크 : 지금 ServiceStack.RedisC# ServiceStack.Redis SETALL 함께

, 임 4 개 방법에서, 지금, 지원하는 몇 가지 일반적인 캐시 메커니즘을 작동 :

넣고는, 가져 오기, PutMany, GetMany

문제는 내가 여러 개의 레코드를 삽입 할 때마다 Put과 달리 만료를 추가하는 옵션이 표시되지 않는다는 것입니다. CachedItem<T>는 내 꺼야

public void PutMany(ICollection<T> items) 
{ 
    TimeSpan expiration = GetExpiration(); 
    DateTime expire = DateTime.UtcNow.Add(expiration); 

    Dictionary<string, CachedItem<T>> dict = new Dictionary<string, CachedItem<T>>(); 
    foreach (T item in items) 
    { 
     CachedItem<T> cacheItem = new CachedItem<T>(item, expire); 

     if (!dict.ContainsKey(cacheItem.Id)) 
      dict.Add(cacheItem.Id, cacheItem); 
    } 

    // Store item in cache 
    _client.SetAll(dict); 
} 

모델, 단지 객체의 일종으로 상상 :

코드는 앞으로 꽤 streight입니다.

보시다시피, 나는 만료를 설정하는 옵션이 없습니다. 이 작업을 수행하려면 (_client.Set()을 사용하여 1을 1을 삽입하는 것 외에) 방법이 있습니까?

TIA.

PS

나는 내가 모든 레코드가 잘못된 하나의 유효 기간 (있을 것이라는 점을 싶지 않는, 목록 또는 해시의 모든 기록을 저장할 수 있고, 때마다 그들은 매우 심각한 성능 문제가 발생할 수있어 만료)

답변

2

Redis에는 set an expiry with a bulk insert을 허용하는 명령이없고 Expire commands 키를 사용하면 여러 키에 만료를 적용 할 수 있습니다.

, 만기 개별적으로 각 항목을 설정, 당신은 queue multiple SET commands in a Redis Transaction 또는 pipeline해야합니다는 N + 1 개 동작을 방지하려면 예 :

using (var trans = Redis.CreateTransaction()) 
{ 
    foreach (var entry in dict) 
    { 
     trans.QueueCommand(r => r.SetValue(entry.Key, entry.Value, expireIn)); 
    } 

    trans.Commit(); 
} 
ServiceStack.Redis 여전히에서 여러 SET 작업을 보내드립니다

bulk Redis transaction.

+0

해당 요청 1 개만큼 좋습니다. –

+0

아직 n + 1 명령입니다. 당신은 루아 btw에서 같은 일을 할 수 있습니다. – MichaC

+0

@MichaC ServiceStack.Redis는 모든 명령을 단일 네트워크 쓰기로 일괄 처리하므로 N + 1 요청 대기 시간이 없습니다. LUA는 더 많은 오버 헤드가됩니다. – mythz