转载于: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 的有序集合(Sorted Set)数据类型。有序集合允许我们为每个成员(即排行榜上的用户或项目...
在"java基于Redis Zset实现排行榜功能"的项目中,我们通常会包括以下几个关键组件: 1. **数据模型**:定义一个UserRank类,包含用户ID(uid)和得分(score)。这将是与Redis交互的基本单位。 2. **Redis连接**:...
我们分析一下排行榜,一个用户一个排名,意味着要去重,这时我们会想到Java的一种数据结构Set。不过Set又是无序的。有没有一种结构是可以保住元素唯一以及有序的呢。 幸运的是,还真的有。Redis的ZSet的就是这样的一...
Redis 使用教程详解 Redis 是一个高性能的 NoSQL 键值存储数据库,广泛应用于缓存、任务列表、网站访问统计数据、过期处理、应用排行榜、分布式集群架构中的 session 分离等领域。下面是 Redis 的详细使用教程。 ...
本示例将详细解释如何利用Redis来实现在ASP.NET MVC应用程序中用户登录功能,并保持用户的登录状态,同时设置过期时间和监控在线用户。 首先,我们需要安装Redis服务器。`Redis-x64-3.2.100.zip`是Redis的一个...
本教程将详细讲解如何利用这个库来实现在ASP.NET MVC中用户的登录和保持登录状态。 首先,我们需要理解Redis的基本概念。Redis是一个开源的、基于键值对的NoSQL数据库,它支持多种数据结构如字符串、哈希、列表、...
使用 Redis 实现页面缓存 本文档主要介绍了使用 Redis 实现页面缓存的方法...总结:使用 Redis 实现页面缓存可以提高网站的访问速度和用户体验。通过设计合理的缓存 key 和缓存实现思路,我们可以实现高效的页面缓存。
在IT领域,消息队列是一种常见的中间件技术,用于在分布式系统中解耦组件,提高...在实际开发中,应根据项目需求调整细节,例如选择合适的Redis数据结构(如Set、Hash等),或考虑使用发布/订阅模式来实现广播通信。
本教程将详细讲解如何使用Tomcat与Redis集成,实现Session的共享。 首先,我们需要理解Tomcat和Redis的基本概念。Tomcat是一款开源的Java Servlet容器,广泛用于部署Java Web应用程序。而Redis则是一种高性能的键值...
接下来,**积分排行榜**是基于用户积分的排序功能。在Redis中,`Sorted Set`数据结构非常适合此场景,它允许我们为每个成员添加分数(在这里是积分)。每当用户获得积分,我们更新其在`Sorted Set`中的分数,如`...
通过使用 Redis 的 setnx 命令和 expire 命令,可以实现分布式锁的功能。但是,需要注意的是,在实现分布式锁时,需要考虑到各种可能的异常情况,例如服务器挂掉等,并且需要对分布式锁进行优化,例如加过期时间,...
SSM+Redis 实现Session共享是现代Web应用中常见的技术组合,主要目的是在分布式系统中保持用户Session的一致性。SSM是指Spring、Spring MVC和MyBatis这三大Java Web开发框架的组合,而Redis则是一种高性能的键值存储...
mvc-session-with-redis2、springmvc项目中,spring集成redis详情查看项目spring-mvc-with-redis3、在maven构建的项目中引入本地jar包详情查看项目web-native-jar4、在spring项目中使用redis实现排行榜详情查看项目...
Redis作为一个高性能的内存数据存储,除了支持缓存和持久化数据,它还有很多功能,如:在博主分享的上一篇文章中,我们介绍了使用Redis实现的延迟队列功能 【Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟...
使用 Ruby 中的 Redis 支持的排行榜排行榜Ruby 中由Redis支持的排行榜。基于http://www.agoragames.com/blog/2011/01/01/creating-high-score-tables-leaderboards-using-redis/中提出的想法。安装gem install ...
本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 在实现 session 共享之前,需要在项目中引入相关依赖项,包括: * ...