转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/129.html?1455808528
排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。
一般排行榜都是有实效性的,比如“用户积分榜”。如果没有实效性一直按照总榜来排,可能榜首总是几个老用户,对于新用户来说,那真是太令人沮丧了。
首先,来个“今日积分榜”吧,排序规则是今日用户新增积分从多到少。
那么用户增加积分时,都操作一下记录当天积分增加的有序集合。
假设今天是 2015 年 04 月 01 日,UID 为 1 的用户因为某个操作,增加了 5 个积分。
Redis 命令如下:
ZINCRBY rank:20150401 5 1
假设还有其他几个用户也增加了积分:
ZINCRBY rank:20150401 1 2ZINCRBY rank:20150401 10 3
看看现在有序集合 rank:20150401 中的数据(withscores 参数可以附带获取元素的 score):
ZRANGE rank:20150401 0 -1 withscores1) "2"2) "1"3) "1"4) "5"5) "3"6) "10"
#p#分页标题#e#
按照分数从高到低,获取 top10:
ZREVRANGE rank:20150401 0 9 withscores1) "3"2) "10"3) "1"4) "5"5) "2"6) "1"
因为只有三个元素,所以就查询出了这些数据。
如果每天记录当天的积分排行榜,那么其他花样百出的榜单也就简单了。
比如“昨日积分榜”:
ZREVRANGE rank:20150331 0 9 withscores
利用并集实现多天的积分总和,实现“上周积分榜”:
ZUNIONSTORE rank:last_week 7 rank:20150323 rank:20150324 rank:20150325 rank:20150326 rank:20150327 rank:20150328 rank:20150329 WEIGHTS 1 1 1 1 1 1 1
这样就将 7 天的积分记录合并到有序集合 rank:last_week 中了。权重因子 WEIGHTS 如果不给,默认就是 1。为了不隐藏细节,特意写出。
那么查询上周积分榜 Top10 的信息就是:
ZREVRANGE rank:last_week 0 9 withscores#p#分页标题#e#
“月度榜”、“季度榜”、“年度榜”等等就以此类推。
下面给出一个 PHP 版的简单实现。使用 Redis 依赖于 PHP 扩展 PhpRedis,代码还依赖于 Carbon 库,用于处理时间。代码量很少,所以就不敲注释了。
<?phpnamespace BlogRedis;use Redis;use CarbonCarbon;class Ranks { const PREFIX = 'rank:'; protected $redis = null; public function __construct(Redis $redis) { $this->redis = $redis; } public function addScores($member, $scores) { $key = self::PREFIX . date('Ymd'); return $this->redis->zIncrBy($key, $scores, $member); } protected function getOneDayRankings($date, $start, $stop) { $key = self::PREFIX . $date; return $this->redis->zRevRange($key, $start, $stop, true);
分享到:
相关推荐
redis实现简单排行榜,和消息处理。
保证能跑通-基于Redis Zset实现排行榜功能的源码,包含页面,接口,下载运行即可访问,步骤请阅读README.MD文件
我们分析一下排行榜,一个用户一个排名,意味着要去重,这时我们会想到Java的一种数据结构Set。不过Set又是无序的。有没有一种结构是可以保住元素唯一以及有序的呢。 幸运的是,还真的有。Redis的ZSet的就是这样的一...
在ASP.NET MVC中使用Redis 的Demo:通过Redis实现用户登陆,并保持登陆状态,设置过期时间,检测在线用户。
Java实现redis,linux安装redis,一分钟学会使用redis,就是这么简单
在ASP.NET MVC中使用Redis 的Demo:通过Redis实现用户登陆,并保持登陆状态,设置过期时间,检测在线用户 开发工具VS2013,StackExchange.Redis
Spring Boot 使用 AOP 和 Redis 实现接口限流是一种高效且实用的方法,用于控制对特定接口的访问频率。以下是实现这个功能的基本步骤: 引入依赖:首先,在 Spring Boot 项目中引入 Redis 和 AOP 的相关依赖。这...
Qt 使用 Redis实现 消息队列,点对点 生产者-消费者 模式
redis页面缓存html使用redis实现页面缓存.docx
tomcat-redis实现session共享
1. 前言 之前写过一篇博客,讲解的是Redis的5种数据结构及其常用命令,当时有读者评论,说希望了解下这...ZSET的经典使用场景是用来实现排行榜,举几个常见的例子,比如百度热榜: 比如微博热搜榜: 比如微信步数排行
高级分布式数据库教程,nosql,mongodb,redis。非常好的分布式教程!
主要介绍了Java基于redis实现分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
redis实现的好友关注,共同好友,积分排行榜功能
今天用了一天来搞定了ssm+redis集成和nginx实现负载均衡,这里只有ssm+redis简单d集成demo,希望大家一起来讨论
基于mq和redis实现的秒杀系统基于mq和redis实现的秒杀系统