2017-09-28 28 views
0

在Redis中,使用SCAN/COUNT命令组合,我们可以按照随机顺序从密钥空间检索密钥。例如,如果密钥空间有100个密钥并且密钥存储为001,002,003 ... 100。如果我们使用命令'scan 0 count 50',结果将包含以随机顺序列出的50个密钥(例如002,003,050 ...)。如何在顺序键中顺序扫描Redis Keyspace存储?

是否有反正我们可以扫描密钥空间并按照存储在Redis中的顺序获取密钥?预期的键盘扫描结果应该像001,002,003,... 050 ...

此外,有没有办法指向Redis键空间中的特定键并扫描下一个'n'键?例如,转到密钥 - 010并从11扫描到30.

请指教。

+0

密钥存储在一个哈希表中,所以要求“按照存储在redis中的顺序”获取它们会给你一个任意的顺序。此外,由于扫描语义和哈希表分区,当您执行COUNT 50时,您可能会得到多于或少于50个的数据。只要清除您的问题中的一些明显的误解即可。接受的答案是好的。 – nnog

回答

2

这两个问题的简短答案是:

可以通过手动进行密钥空间迭代,方法是只对索引的索引进行索引,然后使用ZRANGE和ZRANGEBYLEX以有序的方式扫描键空间并分别从前缀开始扫描。

假设你创建键foo,bar和baz,你还需要索引它们。我们在交易执行此,以确保该指数是一致的,我们已经添加了所有键的有序集合,得分0。这

> MULTI 
> SET foo 1 
> ZADD __index__ 0 foo 
> EXEC 
> 
> MULTI 
> SET bar 2 
> ZADD __index__ 0 bar 
> EXEC 
> 
> MULTI 
> SET baz whatever 
> ZADD __index__ 0 baz 
> EXEC 
... and so on 

通知的意思是,我们可以利用词汇范围的优势。

要迭代索引现在我们只需执行ZRANGE或ZREVRANGE。因为所有元素的得分都是0,所以这个顺序将是字典式的。所以分页前10个元素:

ZRANGE __index__ 0 10 

要从特定条目“foo”的迭代10个键:

ZRANGEBYLEX __index__ [foo + LIMIT 0 10 

这需要在代码中积极的东西,但不是很难做到。但无论如何,长期的答案 - 这是目前实现这一目标的唯一方法。有一些模块可以让你自动化一些,但它还没有完全自动化。

+0

感谢您的解释!我的问题陈述很好的解决方案 – BDENTHUS