Indexing redis中数百万行的字母索引

Indexing redis中数百万行的字母索引,indexing,redis,Indexing,Redis,对于我的应用程序,我需要一个包含数百万行的集合上的字母索引。 当我使用一个排序集,并给所有成员相同的分数时,结果看起来很完美。 性能也很好,对于200万行的测试集,最后三分之一的性能不会明显低于测试集的前三分之一 但是,我需要查询这些结果。例如,获取以“goo”开头的前(最多)100个项目。我玩了zscan和sort,但它没有给我一个工作和性能的结果 由于redis在向排序集插入新成员时速度非常快,因此从技术上讲,必须能够立即(很快)转到正确的内存位置。我想redis使用某种快速排序机制来实现这

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

但是,我需要查询这些结果。例如,获取以“goo”开头的前(最多)100个项目。我玩了zscan和sort,但它没有给我一个工作和性能的结果

由于redis在向排序集插入新成员时速度非常快,因此从技术上讲,必须能够立即(很快)转到正确的内存位置。我想redis使用某种快速排序机制来实现这一点。 但是当我只想查询数据而不想写入数据时,我似乎没有得到结果

我们使用复制的从机进行读取操作,我们更喜欢(默认)只读配置开关。因此,创建一个伪键并在其后删除它(无论多么不合法)并不是一个真正的选项

我有点卡住了,我正在考虑在redis服务器本身中编写一个ZLEX命令。我可以这样使用:

帮助“ZLEX”->(ZLEX设置分数起始值)
--查询已排序集的词典索引,提供“startswith”字符串。
127.0.0.1:12345>ZLEX myset 0 goo LIMIT 0 100
1) 黏液
2) 傻瓜
3) 暴徒
4) 古泽
你的想法是什么?我是否在标准redis命令中遗漏了什么

我们在Debian上使用Redis2.8.4x64

你好,TW

编辑:

注: ->至少我给ZLEX起的名字似乎符合安特里兹(Salvatore)的标准。截至2014年1月24日,我正在实施ZLEX。对于这个用例来说,它似乎是最简单、最直接的解决方案,安特里兹可以为了每个人的利益将它合并到主要分支中。

你看过吗


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

我已经实现了
ZLEX

这是全文。 您可以从这里获取新功能:

我还向安特里兹发出了一个请求


亲切的问候,TW

嗨,沙查夫,是的,我很久以前读过安提雷斯的那篇博文。谢谢分享,这绝对是正确的。然而,它给索引增加了很多开销。这种开销主要是一种技巧,并不能使事情变得简单。我喜欢简单的…:)我们放在redis中的数据是从一个大型RDBMS复制的,记录的更改被推送到主数据库中CRUD操作的redis中。因为我希望索引更新是事务性的(以及我们msgpack所定义的记录),所以我更喜欢逻辑,而不是简单的ZADD。ZLEX=正在工作,但需要测试。更新:在自定义版本2.8.7上测试了ZLEX,运行速度非常快。ZSET中200万行的测试集,分数相同:所有查找都低于1ms。看来这是正确的方法。我做完后再分享。