redis 的 zset 可以设置多个权重吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kayseen
V2EX    Redis

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

  •  
  •   kayseen 2019-08-23 16:26:10 +08:00 15417 次点击
    这是一个创建于 2318 天前的主题,其中的信息可能已经有所发展或是发生改变。
     使用 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     Solana     2570 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 06:36 PVG 14:36 LAX 22:36 JFK 01:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86