对于我的应用程序,我需要一个包含数百万行的集合的字母索引。当我使用排序集并给所有成员相同的分数时,结果看起来很完美。性能也很棒,在 200 万行的测试集上,后三分之一的性能并不明显低于前三分之一。
但是,我需要查询这些结果。例如,获取前(最多)100 个以“goo”开头的项目。我尝试过 zscan 和 sort,但它没有给我一个有效的和高性能的结果。
由于 Redis 在向排序集中插入新成员时速度非常快,因此技术上必须能够立即(嗯,非常快)转到正确的内存位置。我想 Redis 使用某种快速排序机制来完成此任务。但是..当我只想查询数据而不写入数据时,我似乎没有得到结果。
我们使用复制的从属设备进行读取操作,并且我们更喜欢(默认)只读配置开关。因此,创建一个虚拟密钥并随后将其删除(尽管不优雅)并不是一个真正的选择。
我有点卡住了,我正在考虑在 redis-server 本身中编写一个 ZLEX 命令。我可以这样使用:
HELP "ZLEX" -> (ZLEX set score startswith)
-- Query the lexicographical index of a sorted set, supplying a 'startswith' string.
127.0.0.1:12345> ZLEX myset 0 goo LIMIT 0 100
1) goo
2) goof
3) goons
4) goozer
Run Code Online (Sandbox Code Playgroud)
你怎么看?我是否遗漏了标准 redis 命令中的某些内容?
我们在 Debian 上使用 Redis 2.8.4 x64。
亲切的问候,TW
编辑:
注意: 相关问题:indexing-using-redis-sorted-sets -> 至少我给 ZLEX 起的名字似乎符合 Antirez(Salvatore)的标准。截至 2014 年 1 月 24 日,我正在致力于实施 ZLEX。对于这个用例来说,这似乎是最简单、最直接的解决方案,Antirez 可以将其合并到主分支中,以造福于每个人。