利用Redis有序集合开发普适的排行榜功能

  作者:zhanhailiang 日期:2014-12-02

本文将讲解如何基本Redis Sorted Set实现排行榜功能?

首先,请参见Redis数据类型:http://redis.cn/topics/data-types.html

如上所见,Redis有序集合非常适用于有序不重复数据的存储,例如游戏开发中无处不在的排行榜,如等级排行榜,经验排行榜,积分排行榜,历史筹码排行榜等。如果沿用传统的方法,一般是通过后端的定时任务去跑数据来生成排行榜数据,这种方法一方面无法满足产品对功能实时性的要求,另一方面也一定程度上消耗服务器端有限的资源。

以下举例说明如何实现一个积分排行榜:

1. 生成排行榜:

<?php
// vim: set expandtab cindent tabstop=4 shiftwidth=4 fdm=marker:
 
/**
 * @file     initRank.php
 * @version  1.0
 * @author   wade
 * @date     2014-12-02 21:26:11
 * @desc     本文讲述如何基本redis有序集合生成游戏排行榜数据
 */
 
$redis = new Redis();
$redis->connect(‘127.0.0.1‘, ‘6379‘);
 
$scoreKey = ‘user:score‘;
 
// init rank
$uidList = range(10000, 20000); // 初始化列表
shuffle($uidList);
foreach ($uidList as $uid) {
    $score = mt_rand(1, 10000000);
    $redis->zAdd($scoreKey, $score, $uid);
}

2. 获取排行榜前50名数据:

<?php
// vim: set expandtab cindent tabstop=4 shiftwidth=4 fdm=marker:
 
/**
 * @file     initRank.php
 * @version  1.0
 * @author   wade
 * @date     2014-12-02 21:26:11
 * @desc     本文讲述如何基本redis有序集合生成游戏排行榜数据
 */
 
$redis = new Redis();
$redis->connect(‘127.0.0.1‘, ‘6379‘);
 
$scoreKey = ‘user:score‘;
 
// get top 50
// zrange user:score -50 -1 withscores
$top50List = $redis->zRange($scoreKey, -50, -1, TRUE);
var_export($top50List);

查看输出的积分排行榜前50名用户数据如下:

[root@~/wade/codeReview/generate-rank-with-redis-sorted-set]# /usr/local/php/bin/php rank.php
array (
  13297 => ‘9951424‘,
  17470 => ‘9951938‘,
  17397 => ‘9952228‘,
  19427 => ‘9953388‘,
  16800 => ‘9953838‘,
  19573 => ‘9954141‘,
  10100 => ‘9954436‘,
  11310 => ‘9955425‘,
  19995 => ‘9955665‘,
  12099 => ‘9959696‘,
  11619 => ‘9962507‘,
  17208 => ‘9962572‘,
  15769 => ‘9963074‘,
  19104 => ‘9963218‘,
  16343 => ‘9965226‘,
  11645 => ‘9965375‘,
  13185 => ‘9965506‘,
  18588 => ‘9968756‘,
  19764 => ‘9968885‘,
  13172 => ‘9969011‘,
  18031 => ‘9970756‘,
  10349 => ‘9971091‘,
  14612 => ‘9972515‘,
  17465 => ‘9974447‘,
  15812 => ‘9974457‘,
  10341 => ‘9974813‘,
  15415 => ‘9974895‘,
  12187 => ‘9974950‘,
  12426 => ‘9978519‘,
  13607 => ‘9979284‘,
  11375 => ‘9980609‘,
  10921 => ‘9981700‘,
  16360 => ‘9983399‘,
  19203 => ‘9984767‘,
  18970 => ‘9984776‘,
  12227 => ‘9984834‘,
  17479 => ‘9986766‘,
  19803 => ‘9986937‘,
  19509 => ‘9987704‘,
  11215 => ‘9988372‘,
  18280 => ‘9989817‘,
  10092 => ‘9990978‘,
  19089 => ‘9992132‘,
  11744 => ‘9992693‘,
  12533 => ‘9994185‘,
  14711 => ‘9994771‘,
  18623 => ‘9996266‘,
  16919 => ‘9997883‘,
  10886 => ‘9998931‘,
  11263 => ‘9999083‘,
)

源码请见:https://github.com/billfeller/generate-rank-with-redis-sorted-set

时间: 2024-08-04 10:00:41

利用Redis有序集合开发普适的排行榜功能的相关文章

Redis 有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序集合的成员是唯一的,但分数(score)却可以重复. 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1). 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员). 实例 redis 127.0.0.1:6379> ZADD w3ckey 1 r

Redis有序集合

Redis有序集合类似Redis集合存储在设定值唯一性.不同的是,一个有序集合的每个成员带有分数,用于以便采取有序set命令,从最小的到最大的分数有关. Redis 有序set添加,删除和测试中的O(1)的存在成员(固定时间,无论里面包含的元素集合的数量).列表的最大长度为232- 1元素(4294967295,超过4十亿每个元素的集合). 例子 redis 127.0.0.1:6379> ZADD tutorials 1 redis (integer) 1 redis 127.0.0.1:63

redis 有序集合(zset)函数

redis 有序集合(zset)函数 zAdd 命令/方法/函数 Adds the specified member with a given score to the sorted set stored at key. 增加一个或多个元素,如果该元素已经存在,更新它的socre值 虽然有序集合有序,但它也是集合,不能重复元素,添加重复元素只会 更新原有元素的score值 Parameters key score : double value: string Return value Long

Redis 有序集合

有序集合? Redis的有序集合中,每个成员有两个属性. 一个是这个成员的名:MEMBER_NAME: 一个是这个成员的值:MEMBER_SCORE. 1.ZADD 命令 用于将带有给定分值的成员添加到有序集合里面. 如果输入的成员存在于该有序集合,并且该成员分值发生变化时,则更新这个分值. 分值可以是整数值或双精度浮点数. 如果指定的有序集合不存在,则创建一个空的有序集合执行ZADD操作. 127.0.0.1:6379> ZADD key [NX|XX] [CH] [INCR] score m

redis有序集合类型sort set

redis的数据类型之-有序集合 sort set和set类型一样,也是string类型元素的集合,不同的是sort set每个元素都会关联一个权,通过权值可以有序的获取集合中的元素 sort set类型适合场景: 获得排名最前的5个热门帖子信息(通过帖子回复量标识热门帖子),用sql的做法:select  *  from message order by backnum desc limit 5;但是当数据量足够大时,比如有1亿条数据,这一条sql下去就会耗费大量数据库资源,查询速度也很慢,即

python 操作redis有序集合(sorted set)

#coding:utf8 import redis r =redis.Redis(host="23.226.74.190",port=63279,password="66666666666") 1.Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上.分数值可以是整数值或双精度浮点数.如果有序集合 key 不存在,则创建一个空的有序集并执行

Redis有序集合数据类型操作命令

sorted sets类型及操作 sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset(有序集合)会自动重新按新的值调整顺序.可以理解为有两列的mysql表,一列存value,一列存顺序.操作中key理解为zset的名字. zset的方法: zadd:向名称为key的zset中添加元素member,score用于排序.如果该元素存在,则更新其顺序 127.0.0.1:6379> zadd myzset 1 o

Redis有序集合Sorted set操作

 Sorted set全部命令如下: zadd key score1 member1 score2 member2 ... # 将一个或多个member元素及其score值加入到有序集合key当中 zcard key # 返回有序集合key中成员的数量 zcount key min max # 返回有序集合key中score值在min和max之间的成员的数量 zincrby key increment member # 为有序集合key的成员member的score值加上增量increment,

redis 有序集合(set),无需集合(zset)

1.set(无序集合)无序集合每个元素都是string元素的唯一性,不能重复没有修改操作 1.增加 sadd key value1 value2 value3... 2.获取 smembers key 3.删除(删除一个或多个) srem key value value1 value2... 2.zset(有序集合)有序集合每个元素都是string元素的唯一性,不能重复每个元素都关联一个duoble类型的score,表示权重,通过权重将元素从小到大排列没有修改操作1.增加 zadd key sc