2016-11-08 30 views

回答

5

,能夠使用下一個方法

Task<RedisValue[]> StringGetAsync(RedisKey[] keys, CommandFlags flags = CommandFlags.None); 

在StackExchange的DLL。 給出一個鍵數組並接收一個Redis值數組。

1

您可以使用StringGetAsync,但如果密鑰數量過多,可能導致您重載服務器。您可以使用該功能從下面將由50000個鍵獲取所有分頁鍵每頁

public async Task<Dictionary<string, T>> GetManyAsync<T>(ICollection<string> ids, int dbIndex) 
{ 
     var semaphore = new SemaphoreSlim(1); 
     var rs = await ids.ToRedisKeys() 
      .ToObservable() 
      .Buffer(50000) 
      .SelectMany(async keysPage => 
      { 
       try 
       { 
        await semaphore.WaitAsync(); 
        var redisValues = await DoRead(_ => _.StringGetAsync(keysPage.ToArray()), dbIndex); 
        return redisValues.Select(_ => serializer.Deserialize<T>(_)); 
       } 
       finally 
       { 
        semaphore.Release(); 
       } 
      }).SelectMany(_ => _).ToList(); 
     return ids.Zip(rs, (i, r) => new { i, r }).ToDictionary(_ => _.i, _ => _.r); 
} 

測試此功能:

[Fact] 
    public async Task test_redis_paging() 
    { 
     var source = Observable.Range(1, 5); 
     var kvp = await source.Buffer(3).SelectMany(async ls => 
     { 
      string msg = $"item: {ls.First()}; thread {Thread.CurrentThread.ManagedThreadId}"; 
      Console.Out.WriteLine(DateTime.Now.TimeOfDay + msg + " started:"); 
      await Task.Delay(1000); 
      Console.Out.WriteLine(DateTime.Now.TimeOfDay + msg + " finished:"); 

      return ls; 

     }).SelectMany(_=>_).ToList(); 
     (kvp.Count()).Should().Be(5); 
    }