stackexchange redis hashscan возвращает все поля за один раз

Я использую SDK stackexchange.redis на C# и хочу сканировать свой набор хэшей. Я ожидал, что SDK будет выполняться как клиент Redis (когда я выполняю «hscan myKey 0», он вернет несколько пар ключ-значение и курсор, который я буду использовать для следующего сканирования). Но когда я использую SDK stackexchange.redis для реализации метода «hashscan» следующим образом:

redisCache.HashScan(myKey, pageSize:10, cursor: 0)

Он вернет все поля в «myKey», в нем 2000 пар «ключ-значение». Как я могу позволить ему просто возвращать несколько результатов одновременно?

Причина В будущем в «myKey» будут миллионы полей, и если они все вернутся одновременно, это будет стоить много памяти и заблокирует ли онлайн-сервис? Потому что Redis — это однопоточное приложение.

Спасибо!


person Spirit    schedule 07.04.2016    source источник


Ответы (1)


Он делает совсем не то, что вы думаете. Здесь метод HashScan возвращает пользовательский итератор, который поддерживает не более 2 страниц данных; когда вы приближаетесь к концу одной страницы, она автоматически выбирает следующую страницу. По сути, если вы хотите прочитать только 20 элементов, просто прочитайте 20 элементов. Например, LINQs .Take(20) будет работать нормально. Если вы вызовете .ToList() на итераторе, тогда да: он будет ходить от одного конца к другому, динамически извлекая данные по мере необходимости. Итак: не делайте этого :)

Что он не делает:

  • получить все данные одним огромным вызовом Redis
  • выполнять множество небольших вызовов redis перед возвратом из метода HashScan

В качестве примечания: пользовательский итератор реализует пользовательский интерфейс, позволяющий вам выбирать и возобновлять работу курсоров, если вам это нужно.

person Marc Gravell    schedule 07.04.2016