在Redis有序集合(zset)中,是否有办法使用字符串作为分数?

6
也许问题应该是:如何将字符串表示为数字,以便按其数字表示排序的结果与按字符串排序的结果相同?我想出了一种方法,可以对每个字符串排序多达9个字符,但似乎应该有更好的方法。
预先声明,我认为使用Redis的词典命令不起作用。(请参见以下示例。)
例如:假设我想要预先对所有链接到某个ID的名称进行排序,以便我可以使用ZINTERSTORE快速获取基于它们的名称排序的ID的有序列表(而不使用redis的SORT命令)。理想情况下,我希望将ID作为zset的成员,并且每个名称的数字表示将是zset的分数。
这有意义吗?还是我做错了?

你正在尝试实现什么?你的用例是什么? - Barış Uşaklı
2
我们经常使用ZRANGEBYLEX来处理这种情况。 示例(Lua): cData = redis.call( 'zrangebylex', cSliceKey, '[' .. cSliceFilter, '(' .. cSliceFilter .. '\001') 在此示例中,我们使用chr(0)作为分隔符。 - Tw Bert
1个回答

3
您正在尝试使用保序哈希函数为每个id生成一个分数。虽然您似乎已经编写了一个,但您已经发现该得分范围只允许使用前9个字符(顺便说一下,看看您的函数会很有趣)。
与此方法不同,这里有一个更简单的方法,我认为它会更容易 - 使用形式为:的集合成员,并将分数设置为0。这样,您将能够使用字典序排序,并使用类似split(':')的东西从集合的成员中获取id。

1
太棒了!我之前没有考虑在末尾添加ID。尽管我可能会将分数设置为1,这样我就可以使用一些加权函数。再次感谢!! - timbur
2
我刚坐下来开始处理这个问题所涉及的项目,立即意识到这不适用于我想要做的事情,或者至少不如我希望的那样高效。我想使用ZINTERSTORE将ID集合与ZSET相交,这将要求ZSET使用这些ID作为其成员。 - timbur
1
从邮件列表中转发-讨论在此继续:https://groups.google.com/d/msg/redis-db/ifmotqIDwi8/2A6yG4pgYJsJ - Itamar Haber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接