V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kayseen
V2EX  ›  Redis

redis 的 zset 可以设置多个权重吗?

  •  
  •   kayseen · 2019-08-23 16:26:10 +08:00 · 14992 次点击
    这是一个创建于 1951 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    使用 redis 的 zset
    
    比如我在 key 中操作 3 个学生:  student1 和 student2 和 student3
    需要对他们先通过性别,在通过出生日期排序
    然后设置权重  
    
    zadd key student1 score 性别 score 出生日期
    zadd key student2 score 性别 score 出生日期
    zadd key student3 score 性别 score 出生日期
    			  
                  
    请问 redis 中的 zset 可以吗?
    
    我在 Python 中设置两个 score 好像是无效的,不知道是不是我的方法不对
    
    
    12 条回复    2019-11-05 11:11:47 +08:00
    jybox
        1
    jybox  
       2019-08-23 16:35:59 +08:00
    不可以,请用多个 ZSET 来做不同维度的排序
    kayseen
        2
    kayseen  
    OP
       2019-08-23 16:40:31 +08:00
    @jybox
    请教下,
    比如我在 key1 中排序 student1 和 student2 和 student3 的性别:
    zadd key student1 score 性别
    zadd key student2 score 性别
    zadd key student3 score 性别

    在 key2 中排序 student1 和 student2 和 student3 的出生日期:
    zadd key student1 score 出生日期
    zadd key student2 sscore 出生日期
    zadd key student3 score 出生日期


    那么最后怎么再合并排序呢? 请问可以实现吗?
    imherer
        3
    imherer  
       2019-08-23 16:42:40 +08:00
    你这样就搞的太复杂了,redis 不是你这样用的。 要不还是回归到 rds 中去实现吧,可能会好一点
    momocraft
        4
    momocraft  
       2019-08-23 16:49:38 +08:00
    score 只能一个

    如果你可以定义出一个你想要的顺序的 score 就 OK
    IamUNICODE
        5
    IamUNICODE  
       2019-08-23 16:52:54 +08:00
    不能这样玩的
    Ingo
        6
    Ingo  
       2019-08-23 19:07:44 +08:00 via iPhone
    可以考虑把性别和出生日期编码成一个数字
    boob
        7
    boob  
       2019-08-23 21:11:04 +08:00 via Android
    先通过性别,在通过出生日期排序
    然后设置权重 ???没听懂
    boob
        8
    boob  
       2019-08-23 21:12:37 +08:00 via Android
    权重= 性别*日期即可, 如果男大女小, 男=1 女=-1 即可
    lijialiang93
        9
    lijialiang93  
       2019-08-23 22:57:15 +08:00
    用 ZUNIONSTORE 可以将两个 zset 合并成一个新 zset,可以合并时分别设置权重
    https://redis.io/commands/zunionstore
    jifengg
        10
    jifengg  
       2019-08-26 10:29:39 +08:00
    我给你一个我之前的操作。
    首先明确一点,score 是可以用小数的。
    ok,假设你的性别对应 1,2.
    出生日期,你用自己一套算法换算成 0.xxxx 的小于 1 的小数。两个一加,得到 2.xxxxx 或者 1.xxxx 的 score 值,就可以设置到 zset 里面了。
    注意,小数的精度有限,不能太多位。

    这个有个弊端,就是你只能用这两者结合的正序或者倒序,不能一个正序一个倒序。
    不过如果你没有这个需求,那么这种方式你可以考虑一下。
    kayseen
        11
    kayseen  
    OP
       2019-08-26 16:13:49 +08:00
    @jifengg 感谢建议,我现在就用的这种方法,谢谢~
    iIli1iIliIllLiL
        12
    iIli1iIliIllLiL  
       2019-11-05 11:11:47 +08:00
    @boob 乘以-1 会导致负数部分的排序与正数的排序相反,计算好长度乘以 100 可能会更好?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2998 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:06 · PVG 22:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.