2012-02-02 1 views
3

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

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

Edit:

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

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

Вы имели в виду 'КЛЮЧИ *', верно? 'HKEYS' предназначен для перечисления ключей хэша. В любом случае, если вы используете «KEYS» в своем коде, есть большая вероятность, что вы делаете что-то неправильно, то есть не используете Redis, поскольку он должен использоваться. 'KEYS' следует рассматривать только как функцию отладки. Вероятно, вы не используете правильный тип данных redis. Опишите вашу проблему (например, почему вам нужно перечислить ключи), и я мог бы помочь выбрать правильную базу данных redis, соответствующую вашей проблеме. –

+0

См. Ответ http://stackoverflow.com/questions/9127736/redis-sorted-sets-and-best-way-to-store-uids/9195219#9195219 - у вас есть пример масштабируемой ключевой итерации. –

ответ

0

К сожалению, на текущий момент времени, 2012 год, простой ответ нет, однако, с Lua Scripting вы могли бы это сделать, хотя это не прямое переосмысление в строгом смысле.

+0

Может использовать команду SCAN. – Cosmin

+0

Я считаю, что этого не было в 2012 году @Cosmin –

0

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

Downstream, вы будете «перебирать» по вашим ключам, читая nkey s из отсортированного набора, а затем удаляя транзакции из сортированного набора одновременно с удалением связанной пары ключей и значений.

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

Вы можете сделать это на любом языке, который имеет библиотеку Redis, которая поддерживает транзакцию.

+0

Вы можете выполнять итерацию с помощью команды SCAN. – Cosmin

+0

SCAN не существовало, когда задавался этот вопрос. – rianjs

+1

Я добавил пункт к этому ответу, поскольку он был правильным в то время. Люди должны знать о временных ответах перед их маркировкой. –

3

В наличии с Redis 2.8. 0 - это итерационные команды Redis (SCAN, HSCAN и т. Д.), Которые позволяют эффективно перебирать миллиарды ключей. Для вашего конкретного случая, начните использовать HSCAN вместо HKEYS/HGETALL. Это efficient, cheap on server resources and scales very well. Вы даже можете добавить шаблон к 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" 

More details

 Смежные вопросы

  • Нет связанных вопросов^_^