用redis有序集合做积分排行榜,定期对榜里的积分按一定的规则重置。 假如1个星期重置一次,重置就是对当前分数做一个减法,每个人的分数不一样,重置的时候减掉的分数也不一样,也就是说重置之后榜单里所有人的分数是不一样的。 假如现在榜单里有上万条或者上十万条数据,我现在能想到的重置方式有如下几种: 1.一条一条的重置,即先get一条出路,然后按规则得到重置后的积分,最后在set进去; 2.直接一次性把榜单里所有数据全get出来,处理完了之后再全部set回去; 3.按排名段处理,例如先处理1-500,完了501-1000,这样重复直到处理完整个榜单,也就是一次500条get然后再set。 方法一,肯定是不可行的,因为这样效率太低了。 方法二,对于上万条或者上十万条数据不知道效率如何,各位前辈有做过的吗? 方法三,如果是数据库的话这样肯定是可行的,但是redis,假如我先处理1-500排名的数据,处理完了之后在set回去,这处理掉的500条数据肯定会打乱之前的排名,所以这个方法应该也是不可行的。 各位各有做过类似的经历吗?求指教!
我的按日期的自动重置方法,redis的key: rank_by_date:2016_01_01,然后到了第二天,就变成rank_by_date:2016_01_02 了嘛。。
@aojiaotage 你的意思每天生成一个新的key,新的一天这个key里的数据是空的? 不适合我的情况,我重置的时候,只是改变里面的积分,不能生成一个空的key啊
方法三:参考下zscan命令,可以分批处理的
写个eval,用lua脚本批量set喽
127.0.0.1:6379> eval “for i=1,100000,1 do redis.call(‘incrby’,‘test’…i,-100) end” 0 (nil) (0.95s)
@AnzerWall 你这个就是我说的方法二,先全部get出来,然后在批量set。 我不知道这个在上万条或者上十万条的情况下,性能怎么样,会不会有什么问题
@leiwei1991 这个好像可行,我研究研究,谢谢!
@imhered 在新key里面做初始化怎么样~
@aojiaotage 也是可行的,但是给过来的需求是,新key里初始化的值,是根据旧key里的值来决定的,所以还是得取旧key里的值