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

2019-08-23 16:26:10 +08:00
 kayseen

使用 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 好像是无效的,不知道是不是我的方法不对

14850 次点击
所在节点    Redis
12 条回复
jybox
2019-08-23 16:35:59 +08:00
不可以,请用多个 ZSET 来做不同维度的排序
kayseen
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
2019-08-23 16:42:40 +08:00
你这样就搞的太复杂了,redis 不是你这样用的。 要不还是回归到 rds 中去实现吧,可能会好一点
momocraft
2019-08-23 16:49:38 +08:00
score 只能一个

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

这个有个弊端,就是你只能用这两者结合的正序或者倒序,不能一个正序一个倒序。
不过如果你没有这个需求,那么这种方式你可以考虑一下。
kayseen
2019-08-26 16:13:49 +08:00
@jifengg 感谢建议,我现在就用的这种方法,谢谢~
iIli1iIliIllLiL
2019-11-05 11:11:47 +08:00
@boob 乘以-1 会导致负数部分的排序与正数的排序相反,计算好长度乘以 100 可能会更好?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/594545

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX