StackExchange.Redis: пакетный доступ для нескольких хэшей

Поэтому мне нужно получить доступ ко многим различным хэшам (в StackExchange.Redis у меня есть разные RedisKey).

Как лучше (быстрее) это сделать? Например, для этих двух возможных реализаций является правильным? Какой из них работает лучше?

  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);
    

2.

            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();

person Santiago Cerón Uribe    schedule 17.02.2015    source источник


Ответы (1)


О производительности: вы их засекали?

Кроме этого: оба работают и имеют разные компромиссы; последний, например, является синхронным - бит выигрывает от того, что позволяет избежать всех накладных расходов и сложностей TPL. Вы также можете рассмотреть третий вариант — сценарий Lua, который принимает и массив ключей в качестве входных данных и вызывает HGETALL для каждого.

person Marc Gravell    schedule 18.02.2015
comment
Привет. Я попробовал три из них ... как ни странно (для меня), победителем (а иногда и с большим отрывом) была конвейерная обработка (вызов HashGetAllAsync несколько раз и ожидание). Я говорю странно, потому что читал в Интернете, что Lua кажется лучшим решением. Может быть, я использую плохой сценарий? Я использую скрипт, похожий на тот, что опубликован здесь ссылка. - person Santiago Cerón Uribe; 11.03.2015