【问题标题】:Can I define a custom compare function for redis zset?我可以为 redis zset 定义自定义比较函数吗?
【发布时间】:2019-05-26 18:15:54
【问题描述】:

背景:
我现在使用 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

类似的东西

【问题讨论】:

    标签: redis


    【解决方案1】:

    简短回答:不,你不能这样做

    但是,您通常可以组合多个键以使它们可排序。在您的情况下,一个明显的候选者是确定三个部分的最大范围,然后将它们全部组合成一个大数字。例如,1000_100_3000 可能是数字 100001003000(每个块 4 个十进制数字),可以简单地比较或分解。不过,您可能还想用位而不是数字来考虑。例如,可能允许每段 20 位,并使用移位/屏蔽位操作来组合/分解(即(1000 << 40) | (100 << 20) | (3000)

    【讨论】:

    • 这是一个漂亮/高级/专业的提示:)
    • @ItamarHaber 前段时间我疯狂地研究二进制可排序复合键算法;这很有趣,尤其是在查看诸如使浮点二进制可排序之类的事情时。欢乐时光。
    • 感谢您的回复,您的第一个解决方案是我目前的解决方案,但我不确定如果三个分数在增长,redis 中的 max int 是否可以处理这个问题。使用比特会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多