按字母顺序排列的索引,在redis中有数百万行

时间:2014-01-23 15:04:04

标签: indexing redis

对于我的应用程序,我需要一个包含数百万行的字母索引。 当我使用排序集并给所有成员相同的分数时,结果看起来很完美。 性能也很好,测试集为200万行,最后三分之一的表现并不明显低于集合的前三分之一。

但是,我需要查询这些结果。例如,获取以“goo”开头的第一个(最多)100个项目。我玩过zscan并进行排序,但它并没有给我一个有效且高效的结果。

由于在将新成员插入到已排序的集合时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

你有什么想法?我在标准redis命令中遗漏了什么吗?

我们在Debian上使用Redis 2.8.4 x64。

亲切的问候,TW

编辑:

注意: Related issue: indexing-using-redis-sorted-sets - >至少我给ZLEX的名字似乎符合Antirez(Salvatore)的标准。截至2014年1月24日,我正在努力实施ZLEX。对于这个用例来说,它似乎是最简单,最直接的解决方案,而Antirez可以将它合并到主分支中,以便每个人都受益。

2 个答案:

答案 0 :(得分:2)

我已实施ZLEX

以下是完整的specs。 您可以从此处获取新功能:github tw-bert

我还向Antirez here发布了拉取请求。

亲切的问候,TW

答案 1 :(得分:1)

你看过 this 吗?

根据您排序的字段长度,它可能很有用,此方法需要b *(a ^ 2)个键,其中a是字段的长度,b是此字段的行数。