我可以为redis zset定义自定义比较函数吗?

我可以为redis zset定义自定义比较函数吗?,redis,Redis,背景: 我现在使用php+redis作为后端来存储排名。 zset似乎是一个很好的解决方案。 但是排名包含多个分数,如果第一个分数相等,我需要比较第二个分数来决定顺序。总共有3分 我以为会有一个接口,我可以为特定的zset设置一个自定义比较函数,这样我就可以在其中执行排序工作,但我没有找到它。此外,我希望在添加排名时对其进行排序。如果每次有人请求获得排名时我都需要重新排序,那么我认为这是浪费 预期结果: zadd myset 1000_100_3000 matchId1 zadd myset 1

背景:
我现在使用php+redis作为后端来存储排名。 zset似乎是一个很好的解决方案。 但是排名包含多个分数,如果第一个分数相等,我需要比较第二个分数来决定顺序。总共有3分

我以为会有一个接口,我可以为特定的zset设置一个自定义比较函数,这样我就可以在其中执行排序工作,但我没有找到它。此外,我希望在添加排名时对其进行排序。如果每次有人请求获得排名时我都需要重新排序,那么我认为这是浪费

预期结果:

zadd myset 1000_100_3000 matchId1
zadd myset 1000_2500_250 matchId2
zadd myset 1000_2500_200 matchId3
zrange myset 0-1
返回:

matchId2
matchId3
matchId1

类似这样的回答:不,你不能那样做


但是,您通常可以通过这种方式组合多个键,使它们可排序。在您的例子中,一个明显的候选方法是确定三个片段的最大范围,然后将它们全部组合成一个大数字。例如,1000_100_3000可能是数字10000103000(每个区块4个十进制数字),可以简单地进行比较或分解。不过,您可能还想用位而不是数字来思考。例如,可能允许每段20位,并使用移位/掩码位操作来合成/分解(即
(1000这是一个漂亮的/advanced/pro提示:)@ItamarHaber我前一阵子对二进制可排序复合键算法进行了一番狂热的研究;这很有趣,尤其是在研究如何使浮点二进制可排序时。有趣的时刻。感谢您的回复,您的第一个解决方案是我当前的解决方案,但我不确定如果三个分数不断增长,redis中的max int是否能够处理这个问题。使用比特可以更好。