这里以游戏中的排行榜举例: 游戏中存在各种各样的排行榜,比如玩家的等级排名、分数排名等
准备
- 一个典型的游戏排行榜包括以下常见功能:
- 能够记录每个玩家的分数
- 能够对玩家的分数进行更新
- 能够查询每个玩家的分数和名次
- 能够按名词查询排名前N名的玩家
- 能够查询排在指定玩家前后M名的玩家
由于一个玩家名次上升x
位将会引起x+1
位玩家的名次发生变化(包括该玩家),如果采用传统数据库(比如MySQL)来实现排行榜,当玩家人数较多时,将会导致对数据库的频繁修改,性能得不到满足,所以我们只能另想它法。
Redis Zset
下面介绍几个能用于排行榜的命令:
zadd
- 设置玩家分数
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
1 | public function zAdd( $key, $score1, $value1, $score2 = null, $value2 = null, $scoreN = null, $valueN = null ) {} |
zscore
- 查看玩家分数
返回有序集 key 中,成员 member 的 score 值。
1 | public function zScore( $key, $member ) {} |
zrevrange
- 按名次查看排行榜
返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。
起始位置和结束位置都是以0开始的索引,且都包含在内。如果结束位置为-1则查看范围为整个排行榜。
带上withscores则会返回玩家分数。
1 | public function zRevRange( $key, $start, $end, $withscore = null ) {} |
zrank/zrevrank
- 查看玩家的排名
zrank: 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
zrevrank: 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
1 | public function zRank( $key, $member ) {} |
zincrby
- 增减玩家分数
为有序集 key 的成员 member 的 score 值加上增量 increment 。
可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
1 | public function zIncrBy( $key, $value, $member ) {} |
zrem
- 移除某个/多个玩家
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
1 | public function zRem( $key, $member1, $member2 = null, $memberN = null ) {} |
del
- 删除排行榜
删除给定的一个或多个 key 。
1 | public function del( $key1, $key2 = null, $key3 = null ) {} |