Перебор ключей в Redis - PullRequest
       6

Перебор ключей в Redis

6 голосов
/ 02 февраля 2012

Я только начал с Redis.Моя БД содержит около 1 миллиарда записей.Использование HKEYS * приводит к ошибке нехватки памяти.

Есть ли способ перебора ключей?Что-то вроде HKEYS *, но с ограничением n?

Редактировать:

Я сейчас использую цикл, который соответствует шаблону

for c in '1234567890abcedf':
    r.keys(c + '*')

Ответы [ 4 ]

4 голосов
/ 07 ноября 2016

Начиная с Redis 2.8.0, доступны итерационные команды Redis на основе курсора (SCAN, HSCAN и т. Д.), Которые позволяют эффективно выполнять итерацию более миллиардов ключей. Для вашего конкретного случая начните использовать HSCAN вместо HKEYS / HGETALL. Он эффективен, дешев на ресурсах сервера и отлично масштабируется . Вы даже можете добавить шаблон к HSCAN в отличие от HKEYS.

, например

127.0.0.1:6379> HMSET hash0 key0 value0 key1 value1 entry0 data0 entry1 data1
OK
127.0.0.1:6379> HSCAN hash0 0 MATCH key* 
1) "0"
2) 1) "key0"
   2) "value0"
   3) "key1"
   4) "value1"
127.0.0.1:6379> HSCAN hash0 0 
1) "0"
2) 1) "key0"
   2) "value0"
   3) "key1"
   4) "value1"
   5) "entry0"
   6) "data0"
   7) "entry1"
   8) "data1"
0 голосов
/ 24 апреля 2014

Вы не можете выполнять итерации по ключам redis напрямую, но вы можете сделать что-то очень похожее, записав транзакционную часть key вашей пары ключ-значение в отсортированный набор одновременно с написанием key - value pair.

В нисходящем направлении вы «перебираете» свои ключи, читая n key s из отсортированного набора, а затем транзакционно удаляя их из отсортированного набора одновременно с удалениемсоответствующая пара ключ-значение.

Я написал здесь пример с кодом C #: http://rianjs.net/2014/04/how-to-iterate-over-redis-keys/

Это можно сделать на любом языке, в котором есть библиотека redis, поддерживающая транзакции.

0 голосов
/ 21 марта 2015

Для перебора ключей:

SCAN cursor [MATCH pattern] [COUNT count]

http://redis.io/commands/scan

Для перебора значений хеша

HSCAN key cursor [MATCH pattern] [COUNT count]

http://redis.io/commands/hscan

0 голосов
/ 11 мая 2012

Извините, в настоящее время, 2012 год, простой ответ - нет, однако, с помощью сценариев lua вы можете это сделать, хотя это не прямое повторное редактирование в самом строгом смысле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...