Redis、StackExchange、配合MGET,一次获取多个key

Redis, StackExchange, work with MGET, get many keys at once

有没有办法将 MGET 与 StackExchange Redis (C#) 结合使用?

我需要一种方法来一次调用多个键。

可以使用下一个方法

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

在 StackExchange 的 DLL 中。 给出一组键并接收一组 Redis 值。

您可以使用 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);
    }