MGET를 StackExchange Redis (C#)와 함께 사용하는 방법이 있습니까?Redis, StackExchange, MGET을 사용하여 즉시 많은 키를 얻으십시오
한 번의 호출로 많은 키를 읽는 방법이 필요합니다.
MGET를 StackExchange Redis (C#)와 함께 사용하는 방법이 있습니까?Redis, StackExchange, MGET을 사용하여 즉시 많은 키를 얻으십시오
한 번의 호출로 많은 키를 읽는 방법이 필요합니다.
이 StackExchange의 DLL 내의 다음의 방법을
Task<RedisValue[]> StringGetAsync(RedisKey[] keys, CommandFlags flags = CommandFlags.None);
를 사용할 수있다. 키 배열을 지정하고 Redis 값 배열을받습니다.
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);
}
테스트를 페이징 모든 키를 가져옵니다 그 아래에서 기능을 사용할 수 있습니다