迭代Redis中的键

时间:2012-02-02 12:24:44

标签: redis

我刚刚开始使用Redis。我的数据库包含大约10亿条记录。使用HKEYS *会导致内存不足错误。

有没有办法迭代密钥?像HKEYS *但有限制n?

的东西

修改

我现在正在使用一个匹配模式的循环

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

4 个答案:

答案 0 :(得分:4)

可用,因为Redis 2.8.0是基于游标的Redis迭代命令(SCAN,HSCAN等),可让您有效地迭代数十亿个密钥。 对于您的具体情况,开始使用HSCAN而不是HKEYS / HGETALL。它是efficient, cheap on server resources and scales very well。与HKEYS不同,您甚至可以将模式添加到HSCAN

e.g。

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"

答案 1 :(得分:0)

很抱歉,在2012年的当前时间,简单的答案是否定的,然而,使用lua脚本编写你可以做到,尽管这不是最严格意义上的直接redis。

答案 2 :(得分:0)

你不能直接迭代redis密钥,但是你可以通过在编写{同一时间}将键值对的key部分事务写入有序集来完成非常相似的事情。 {1}} - key对。

下游,你会"迭代"通过从排序集中读取value n,然后在删除关联的键值对的同时从排序集中以事务方式将其删除。

我在这里用一些C#代码写了一个例子:http://rianjs.net/2014/04/how-to-iterate-over-redis-keys/

您可以使用具有支持事务的redis库的任何语言执行此操作。

答案 3 :(得分:0)

用于迭代键:

SCAN cursor [MATCH pattern] [COUNT count]

http://redis.io/commands/scan

用于迭代哈希值

HSCAN key cursor [MATCH pattern] [COUNT count]

http://redis.io/commands/hscan