如何在订单键中按顺序扫描Redis Keyspace?

时间:2017-09-28 17:39:53

标签: redis

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

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

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

请建议。

1 个答案:

答案 0 :(得分:3)

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

可以手动执行键空间迭代,通过索引仅对其负责的有序集合中的键,然后使用ZRANGE和ZRANGEBYLEX以有序方式扫描键空间并从前缀开始扫描分别。

假设您创建了密钥foo,bar和baz,您还需要为它们编制索引。我们在事务中执行此操作以确保索引是一致的

> 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 

请注意,我们已将所有键添加到分数为0的分类集中。这意味着我们可以利用词汇范围。

现在我们只需要执行ZRANGE或ZREVRANGE来迭代索引。由于所有元素的得分均为0,因此订单将为词典。分页前10个元素:

ZRANGE __index__ 0 10

从特定条目" foo":

迭代10个键
ZRANGEBYLEX __index__ [foo + LIMIT 0 10

这需要代码中的活动内容,但 很难做到。但无论如何,答案很长 - 这是目前实现这一目标的唯一途径。有些模块可以让你自动化一点,但它还没有完全自动化。