2021-09-30
作者:互联网
一、故障现象
- redis key 复制
需求:复制某个榜单,并创建一个新的假榜单
结果:由于后台可以对这个榜单分值进行处理,结果榜单数据处理出错,
- 创建一个后台可以修改的榜单
在写这个时使用的是获取数据库数据并循环遍历处理数据,初始化榜单另一个榜单时直接从数据库拿数据进行计算,多次遍历数据处理,写入榜单,导致数据处理过慢,好在只执行一次这个方法
二、导致原因
数据复制过程出现错误,但在测试环境没有出错,正式出错
没有找到
三、解决方案
直接在对要复制的榜单使用 zset自带命令 进行复制
zunionstore amd:rank:xxx:modify 1 amd:rank:xxxx
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。
WEIGHTS
使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。
如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。
AGGREGATE
使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。
默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。
可用版本:
>= 2.0.0
时间复杂度:
O(N)+O(M log(M)), N 为给定有序集基数的总和, M 为结果集的基数。
返回值:
保存到 destination 的结果集的基数。
redis> ZRANGE programmer 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
redis> ZRANGE manager 0 -1 WITHSCORES
1) "herry"
2) "2000"
3) "mary"
4) "3500"
5) "bob"
6) "4000"
redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3 # 公司决定加薪。。。除了程序员。。。
(integer) 6
redis> ZRANGE salary 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
7) "herry"
8) "6000"
9) "mary"
10) "10500"
11) "bob"
12) "12000"
引用位置
http://doc.redisfans.com/sorted_set/zunionstore.html
四 、优化建议
下一次新写一个 榜单,如果没有数据,需要初始化,直接造假数据,后台redis写二十条数据很快的,不要遍历数据库找真实数据.,或者提前找好真实数据,手动注入. 原因:就是快
标签:榜单,成员,09,redis,给定,score,WEIGHTS,2021,30 来源: https://blog.csdn.net/qq_42757177/article/details/120562793