Redis排行榜实现

需求(排行榜实现):根据分值排序,需要知道自己具体的排名 如(自己排名:4000),数据可能会达到千万,使用Redis实现

首先想到使用Zset来实现,Zset基于score的排序
skiplist(跳表)作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值,使用dict来保存元素和分值的映射关系

方案:
1.直接使用相关命令将数据写入到zset结构中(key:rank.score,value:…),后直接使用zrank获取排名

2 . 大致计算1000w条数据占用内存大小,如:一个member成员大小20字节,这些数据占内存200M左 右,如果采用方案一,key对应的value就比较大,这样查询不是很便利。
我们可以做出一个拆分的方案,将数据分开存放。创建不同的Key,比如,按照score拆分N个key,如:(rank.score.100,rank.score.200,rank.score.300,rank.score.400…) ,

每次当score发生变化时,将用户的socre 缓存起来key:role.id.socre key:score
rank_key_score=(score/100+1)*100
先使用缓存的旧score,计算旧的value存放在哪个key(如:score=190, oldkey=rank.score.200)
使用新的score计算出,value应该存放在哪个key上(如:score=250, newkey=rank.score.300)

当oldkey != newkey 时删除oldkey中的member,并将新的value存放到newkey中

获取自己的排名,如:score=220,key=rank.score.300,先获取在rank.score.300中的排名
zrank(rank.score.300)+count(rank.score.200)+count(rank.score.100)=xxxx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值