2016-09-01 3 views
1

REDIS와 StackExchange Redis 클라이언트부터 시작하겠습니다. REDIS에서 한 번에 여러 항목을 가져 오는 최상의 성능을 얻는 지 궁금합니다.이것이 StackExchange Redis 파이프 라이닝의 좋은 구현입니까?

상황 : 사용자의 대시 보드에 개인 캘린더를 표시하는 ASP.NET MVC 웹 응용 프로그램이 있습니다. 대시 보드는 방문 페이지이므로 많이 사용됩니다.

하면 일정 항목을 표시하려면 내가 먼저 특정 월에 대한 모든 일정 항목의 ID를의를 얻을 수 :

"CalendarItemCache_1" 
"CalendarItemCache_2" 
"CalendarItemCache_3" 
etc. 
:

RedisManager.RedisDb.StringGet("calendaritems_2016_8"); 
// this returns JSON Serialized List<int> 

그런 다음 각 일정 항목 ID에 대한 I는 해당 캐시 키의 목록을 작성

var multipleItems = CacheHelper.GetMultiple<CalendarItemCache>(cacheKeys); 

목 : 나는 일반적인 기능 레디 스에게 다가이 컬렉션으로

에서 구현 된 :

public List<T> GetMultiple<T>(List<string> keys) where T : class 
    { 
     var taskList = new List<Task>(); 
     var returnList = new ConcurrentBag<T>(); 

     foreach (var key in keys) 
     { 
      Task<T> stringGetAsync = RedisManager.RedisDb.StringGetAsync(key) 
       .ContinueWith(task => 
       { 
        if (!string.IsNullOrWhiteSpace(task.Result)) 
        { 
         var deserializeFromJson = CurrentSerializer.Serializer.DeserializeFromJson<T>(task.Result); 
         returnList.Add(deserializeFromJson); 
         return deserializeFromJson; 
        } 
        else 
        { 
         return null; 
        } 
       }); 
      taskList.Add(stringGetAsync); 
     } 
     Task[] tasks = taskList.ToArray(); 
     Task.WaitAll(tasks); 

     return returnList.ToList(); 
    } 

나는 파이프 라이닝을 올바르게 구현합니까? REDIS CLI 모니터는 다음을 표시합니다.

1472728336.718370 [0 127.0.0.1:50335] "GET" "CalendarItemCache_1" 
1472728336.718389 [0 127.0.0.1:50335] "GET" "CalendarItemCache_2" 
etc. 

MGET 명령이 필요합니다.

미리 감사드립니다.

답변

0

RedisKey []를 (를) 허용하는 StringGet에 대한 오버로드 메서드를 발견했습니다. 이것을 사용하여 모니터에 MGET 명령이 표시됩니다.

public List<T> GetMultiple<T>(List<string> keys) where T : class 
    { 
     List<RedisKey> list = new List<RedisKey>(keys.Count); 
     foreach (var key in keys) 
     { 
      list.Add(key); 
     } 

     RedisValue[] result = RedisManager.RedisDb.StringGet(list.ToArray()); 

     var redisValues = result.Where(x=>x.HasValue); 
     var multiple = redisValues.Select(x => DeserializeFromJson<T>(x)).ToList(); 
     return multiple; 

    } 
관련 문제