我刚刚开始使用Redis。我的数据库包含大约10亿条记录。使用HKEYS *
会导致内存不足错误。
有没有办法迭代密钥?像HKEYS *
但有限制n?
修改
我现在正在使用一个匹配模式的循环
for c in '1234567890abcedf':
r.keys(c + '*')
答案 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]
用于迭代哈希值
HSCAN key cursor [MATCH pattern] [COUNT count]