redis有序集合的理解

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个 double 类型的分数(不是1/3,1/2这种分数,是一个用来比较大小的数字)。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数 (score) 却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O (1)。 集合中最大的成员数为 2^32 - 1^ (4294967295, 每个集合可存储 40 多亿个成员)。

有序集合首先是集合,其成员(member)具有唯一性,其次,每个成员关联了一个分数(score),使得成员可以按照分数排序。

需求描述

设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前 10 名的排行榜,你会怎么做呢?一般的做法是写一条类似下面这条 sql 语句的方式来获取:

1

select * from game_socre order by score desc limit 0,20

这种方式在数据量较小的情况下可行,但是在数据量大的情况下查询速度将变慢,特别是还需要联表查询时,速度下降的就更明显了。

实现

这时你可以考虑使用 redis 来实现这个功能。

实现这个功能主要用到的 redis 数据类型是 redis 的有序集合 zset。zset 是 set 类型的一个扩展,比原有的类型多了一个顺序属性。此属性在每次插入数据时会自动调整顺序值,保证 value 值按照一定顺序连续排列。

主要的实现思路是:

1、在一个新的玩家参与到游戏中时,在 redis 中的 zset 中新增一条记录(记录内容看具体的需求)score 为 0

2、当玩家的经验值发生变化时,修改该玩家的 score 值

3、使用 redis 的 ZREVRANGE 方法获取排行榜

返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减 (从大到小) 来排列。具有相同 score 值的成员按字典序的反序排列。 除了成员按 score 值递减的次序排列这一点外,ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。

1

redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN

1、数据准备

b9c118380d12cbd9350fb4b7f028b3c.png

2、获取 score 高分 top10 排名 (ZREVRANGE 为降序,ZRANGE 为升序)

1e8c358b8a6d91ebb01119036852138.png

3、查看用户 ee 的实际排名 (ZREVRANK 为降序,ZRANK 为升序)、实时分数

54cae0fd18770201b8dbb09cff6f856.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值