Redis 实现排行榜功能

这里以游戏中的排行榜举例: 游戏中存在各种各样的排行榜,比如玩家的等级排名、分数排名等

准备

  • 一个典型的游戏排行榜包括以下常见功能:
      1. 能够记录每个玩家的分数
      1. 能够对玩家的分数进行更新
      1. 能够查询每个玩家的分数和名次
      1. 能够按名词查询排名前N名的玩家
      1. 能够查询排在指定玩家前后M名的玩家

由于一个玩家名次上升x位将会引起x+1位玩家的名次发生变化(包括该玩家),如果采用传统数据库(比如MySQL)来实现排行榜,当玩家人数较多时,将会导致对数据库的频繁修改,性能得不到满足,所以我们只能另想它法。

Redis Zset

Redis 有序集合

下面介绍几个能用于排行榜的命令:

  • 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
2
public function zRank( $key, $member ) {}
public function zRevRank( $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 ) {}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :