2016-11-08 2 views

답변

5

이 StackExchange의 DLL 내의 다음의 방법을

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

를 사용할 수있다. 키 배열을 지정하고 Redis 값 배열을받습니다.

1

StringGetAsync를 사용할 수 있지만 엄청난 양의 키가있는 경우 서버가 과부하 될 수 있습니다.

[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); 
    } 
:이 기능을 위해 페이지 당 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); 
} 

테스트를 페이징 모든 키를 가져옵니다 그 아래에서 기능을 사용할 수 있습니다