需求(排行榜实现):根据分值排序,需要知道自己具体的排名 如(自己排名: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