2

So I need to access in bulk many different hashes (in StackExchange.Redis, I have different RedisKey's).

What is the best (fastest) way to do it? For example, for these two possible implementations, is either correct? Which one works better?

1.

List<Task<HashEntry[]>> list = new List<Task<HashEntry[]>>();
List<RedisKey> keys; //Previously initialized list of keys
foreach (var key in keys)
{
    var task = db.HashGetAllAsync(key);
    list.Add(task);
}
await Task.WhenAll(list);
List<Task<HashEntry[]>> list = new List<Task<HashEntry[]>>();
List<RedisKey> keys; //Previously initialized list of keys
IBatch batch = db.CreateBatch();
foreach (var key in keys)
{
    var task = batch.HashGetAllAsync(key);
    list.Add(task);
}
batch.Execute();
Dan Atkinson
  • 11,391
  • 14
  • 81
  • 114

1 Answers1

3

On performance: have you timed them?

Other than that: both work, and have different trade-offs; the latter is synchronous, for example - bit benefits from avoiding all of the TPL overheads and complications. You might also want to consider a third option - a Lua script that accepts and array of keys as input and invokes HGETALL for each.

Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
  • Hello. I tried the three of them ... oddly (for me) the winner (and sometimes by a large margin) was "pipelining" (calling HashGetAllAsync multiple times and awaiting). I say oddly because reading on the internet, Lua seemed to be a superior solution. Maybe I am using a bad script? I am using a similar script to the one posted here [link](http://stdout.tradier.com/development/2014/07/10/using-lua-to-implement-multi-get-on-redis-hashes.html). – Santiago Cerón Uribe Mar 11 '15 at 20:01