使用 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 好像是无效的,不知道是不是我的方法不对
1
jybox 2019-08-23 16:35:59 +08:00
不可以,请用多个 ZSET 来做不同维度的排序
|
2
kayseen OP @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 出生日期 那么最后怎么再合并排序呢? 请问可以实现吗? |
3
imherer 2019-08-23 16:42:40 +08:00
你这样就搞的太复杂了,redis 不是你这样用的。 要不还是回归到 rds 中去实现吧,可能会好一点
|
4
momocraft 2019-08-23 16:49:38 +08:00
score 只能一个
如果你可以定义出一个你想要的顺序的 score 就 OK |
5
IamUNICODE 2019-08-23 16:52:54 +08:00
不能这样玩的
|
6
Ingo 2019-08-23 19:07:44 +08:00 via iPhone
可以考虑把性别和出生日期编码成一个数字
|
7
boob 2019-08-23 21:11:04 +08:00 via Android
先通过性别,在通过出生日期排序
然后设置权重 ???没听懂 |
8
boob 2019-08-23 21:12:37 +08:00 via Android
权重= 性别*日期即可, 如果男大女小, 男=1 女=-1 即可
|
9
lijialiang93 2019-08-23 22:57:15 +08:00
用 ZUNIONSTORE 可以将两个 zset 合并成一个新 zset,可以合并时分别设置权重
https://redis.io/commands/zunionstore |
10
jifengg 2019-08-26 10:29:39 +08:00
我给你一个我之前的操作。
首先明确一点,score 是可以用小数的。 ok,假设你的性别对应 1,2. 出生日期,你用自己一套算法换算成 0.xxxx 的小于 1 的小数。两个一加,得到 2.xxxxx 或者 1.xxxx 的 score 值,就可以设置到 zset 里面了。 注意,小数的精度有限,不能太多位。 这个有个弊端,就是你只能用这两者结合的正序或者倒序,不能一个正序一个倒序。 不过如果你没有这个需求,那么这种方式你可以考虑一下。 |
12
iIli1iIliIllLiL 2019-11-05 11:11:47 +08:00
@boob 乘以-1 会导致负数部分的排序与正数的排序相反,计算好长度乘以 100 可能会更好?
|