2016-09-01 13 views
1

私はREDISとStackExchange Redisクライアントから始めます。 REDISから一度に複数のアイテムを取得するための最高のパフォーマンスを得ているのだろうかと思います。これはStackExchange Redisのパイプライニングの良い実装ですか?

状況: ユーザーのダッシュボードに個人用の予定表を表示するASP.NET MVC Webアプリケーションがあります。ダッシュボードはランディングページなので、頻繁に使用されます。予定表アイテムを表示するには

、私は最初にその特定の月のすべての予定表アイテムIDを取得:

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

その後、各予定表アイテムIDの私は、対応するキャッシュキーのリストを作成:

"CalendarItemCache_1" 
"CalendarItemCache_2" 
"CalendarItemCache_3" 
etc. 

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

のTh:私は、一般的な機能でのRedisに手を差し伸べるこのコレクションでは

atの実装は次のようになります。

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; 

    } 
関連する問題