Redis学习之Sort Set详解

本文和大家分享的主要是Redis中Sort Set相关内容,一起来看看吧,希望对大家学习redis有所帮助。

游戏服务器需要做一个排行榜实时更新,如果沿用传统的方法,一般是通过后端的定时任务去跑数据来生成排行榜数据,这种方法一方面无法满足产品对功能实时性的要求,另一方面也一定程度上消耗服务器端有限的资源。如果从每次数据库读取数据并进行排名(使用Mysql的sort关键字进行排序),在关卡数据量的级数大时是一种效率低的方法。在查阅大量资料后,发现了Redis中的有序集合(Sort Set)。

Redis有序集合

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32 - 1。

应用场景

Redis有序集合非常适用于有序不重复数据的存储,例如游戏开发中无处不在的排行榜,如等级排行榜,经验排行榜,积分排行榜,历史筹码排行榜等。

相关命令

.ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数

.ZCARD key 获取有序集合的成员数

.ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员

.ZRANK key member 返回有序集合中指定成员的索引

.ZREM key member [member ...] 移除有序集合中的一个或多个成员

.ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

使用场景

1.输入5个用户的积分(uid, score), 实现top-3的查询, 某个用户更新积分, 再次查询top-3.

2.添加积分:添加 (player0001, 1800), (player0002, 1987), (player0003, 965), (player0004, 4382), (player0005, 0), 并假定 rank 为sorted set的name.

3.查询5人的积分排行榜;

4.更新player005的积分;

5.重新查询5人的积分排行榜;

PHP实现

排行榜思想:玩家每次积分发生变动时,更改Redis中相应玩家的积分。当客户端向服务器请求调用GetRank时,php服务器调用zrangeRank函数,返回相应的数据。

/**

* 更新排行榜数据

*/

protected function initRankingList()

{

$account = new AccountModel();

$list = $account->getAccountIdList();

foreach ($list as $k => $v) {

$ranks = $this->getStageStar($v["id"]);

$this->zsetRank($ranks["star"], $ranks["rainbow"], $ranks["wing"], $v["id"]);

}

}

/**

* 更新某个玩家的排行榜数据

@param $playerid

*/

protected function setPlayerRank($playerid)

{

$ranks = $this->getStageStar($playerid);

$this->zsetRank($ranks["star"], $ranks["rainbow"], $ranks["wing"], $playerid);

$this->hsetOption($playerid, $ranks["star"], $ranks["rainbow"], $ranks["wing"]);

}

protected function setStars($playerid)

{

$ranks = $this->getStageStar($playerid);

$this->hsetOption($playerid, $ranks["star"], $ranks["rainbow"], $ranks["wing"]);

}

/**

* 设置分数

@param $star

@param $rainbow

@param $wing

@param $playerid

*

@throws \\Exception

*/

protected function zsetRank($star, $rainbow, $wing, $playerid)

{

if ($this->redis == null) {

throw new \\Exception("can not connect redis");

}

$score = C("STAR_SCORE") * $star + C("RAINBOW_SCORE") * $rainbow + C("WING_SCORE") * $wing;

$this->redis->zAdd($this->rank, $score, $playerid);

}

/**

* 获取某个用户的排名

@param $playerid

*

@return int

@throws \\Exception

*/

protected function zrevRank($playerid)

{

if ($this->redis == null) {

throw new \\Exception("can not connect redis");

}

$res = $this->redis->zRevRank($this->rank, $playerid);

return $res;

}

/**

* 获取某个范围的用户排名

@param $start

@param $stop

*

@return array

@throws \\Exception

*/

protected function zrangeRank($start, $stop)

{

if ($this->redis == null) {

throw new \\Exception("can not connect redis");

}

$res = $this->redis->zRevRange($this->rank, $start, $stop, "WITHSCORES");

return $res;

}

/**

* 删除某个用户的排名

@param $playerid

*

@return int

@throws \\Exception

*/

protected function zdeleteRank($playerid)

{

if ($this->redis == null) {

throw new \\Exception("can not connect redis");

}

$res = $this->redis->zRem($this->rank, $playerid);

return $res;

}

来源:简书

时间: 2024-10-09 20:22:47

Redis学习之Sort Set详解的相关文章

Redis学习笔记4-Redis配置详解

原文:  http://blog.csdn.net/mashangyou/article/details/24555191 在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redis学习笔记中Redis的按照方式按照后,Redis的配置文件是/etc/redis/6379.conf.下面是Redis2.8.9的配置文件各项的中文解释. 1 #daemon

Redis学习之数据类型List详解

本文和大家分享的主要是redis数据类型中的list相关内容,一起来看看吧,希望对大家学习redis有所帮助. list即链表,它是一个能维持数据先后顺序的列表,便于在表的两端追加和删除数据,中间位置的存取具有O(N)的时间复杂度,是一个双向链表. 一.内部原理 redis内部实现代码在quicklist.c(注释:A doubly linked list of ziplists)中,它确实是一个双向链表,并且是一个ziplist双向列表. ziplist是什么? 一个经过特殊编码的的双向链表,

Redis学习之外部扩展模块详解

Redis从4.0版本开始加入了对外部扩展模块的支持.外部扩展模块可以实现新的Redis命令,新的Redis数据结构,总之基本上可以做到所有Redis内核可以做的事情.本文和大家分享的就是redis外部扩展模块相关内容,一起来看看吧,希望对待学习redis有所帮助.  我个人认为这是迄今为止,Redis最重要的一个改进.友好的API.完善的文档和健壮的基础结构,会快速吸引大量的第三方开发者不断贡献新的内容,Redis的用途必然会更加广泛,用户群也会随之扩大.  模块的实现  Redis模块需要引

Redis学习之字符串类型详解

本文和大家分享的主要是Redis中字符串相关内容,一起来看看吧,希望对大家学习redis有所帮助. 字符串类型是最基本的数据类型,能够存储所有的字符串,包括二进制数据 json 化对象, 一个字符串类型的键的数据的最大容量是 512 MB 字符串类型是其他几种类型的基础,如列表类型是以列表的形式组织字符串,集合类型是以集合的形式组织字符串 获得符合规则的键名列表 keys pattern # ? 匹配一个字符 # *  匹配任意一个字符 # [] 匹配括号中的任意一个字符.可以使用 - 表示范围

Redis学习之列表类型详解

本文和大家分享的主要是redis的列表类型相关内容,一起来看看吧,希望对大家学习redis有所帮助. 列表类型,可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段 列表类型内部是使用双向链表实现的,所以向列表两端添加元素的时间复杂度是 o(1),获取越接近两端的元素速度就越快 链表的代价是通过索引访问元素比较慢 向列表两端添加元素 向列表左边添加元素,返回增加后列表的长度 LPUSH key value1 value2 127.0.0.1:6379> LPUS

linux sort 命令详解

原文:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html linux sort 命令详解 sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [[email protected] programming]$ cat seq.txtba

[转]linux sort 命令详解

原文网址:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [[email protected] programming]$ cat seq.txtbananaapplepearorange[[email protected] programming]$ sort seq.t

redis.conf 配置文档详解

redis 配置文档详解. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411

Redis实战和核心原理详解(5)使用Spring Session和Redis解决分布式Session跨域共享问题

Redis实战和核心原理详解(6)使用Spring Session和Redis解决分布式Session跨域共享问题 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提