搜索

Redis 实现排行榜,看这篇文章就够了

发表于 2025-11-05 03:06:10 来源:益强智未来

前言

在日常的现排行榜服务器开发过程中,经常会遇到排行榜的看篇需求。这里我们主要讨论使用redis zset来实现一般的文章常用排行榜。也就是现排行榜单key排行榜,分数为整数,看篇一般长度不过万。文章

ZSet概述

Redis的现排行榜ZSet(Sorted Set)是一种有序集合,它结合了Set和SortedList的看篇特性,成员是文章唯一的,且按照成员的现排行榜分数(score)进行从小到大排序。在ZSet中,看篇每个元素都会关联一个分数,文章分数可以重复,现排行榜但元素不能重复。看篇这使得ZSet非常适合用于实现排行榜等场景。文章

每个直播间都有粉丝的排行榜,可以通过key+直播间id来作为redis的key。例如broadcast:20210108231。每个直播间的观众按照点赞数排序。则观众刚刚进入直播间即可通过ZADD添加排行榜。IT技术网

复制张三 观众进入直播间。 李四 进入直播间 ZADD [key] [score] [value]1.2.3.

ZADD broadcast:20240108231 1 zhangsan ZADD broadcast:20240108231 1 lisi

1、加分值

复制`李四` 送了直播间两颗小红心。李四分值`加2`。 `ZINCRBY [key] increment [member]1.2.

ZINCRBY broadcast:20240108231 2 lisi

2、展示榜单

通过如上指令对直播间分值进行设置之后,得到redis的value如下:

复制127.0.0.1:6379> ZRANGE broadcast:20240108231 0 -1 WITHSCORES 1) "zhaoliu" 2) "2" 3) "wangwu" 4) "5" 5) "lisi" 6) "8" 7) "zhangsan" 8) "10"1.2.3.4.5.6.7.8.9.

3、查看直播间人数

ZCARD key 返回集合数量。

复制127.0.0.1:6379> zcard broadcast:20240108231 (integer) 41.2.

4、离开直播间

张三离开直播间,则删除对应key。ZREM [key] [value]

复制127.0.0.1:6379> ZREM broadcast:20240108231 zhangsan (integer) 1 127.0.0.1:6379> ZREVRANGE broadcast:20240108231 0 2 1) "lisi" 2) "wangwu" 3) "zhaoliu"1.2.3.4.5.6.

5、周榜

真实场景中肯定会有时间段的划分,例如查看日榜、周榜、月榜。只需要按照最小的单位按照时间区分成不同的集合,最后求出这些集合的并集即可。

图片

ZADD broadcast:1 10 zhangsan

ZADD broadcast:1 10 lisi

ZADD broadcast:2 5 zhangsan

ZADD broadcast:2 5 wangwu

如此,得到两个zset集合,最后得到两个集合的并集。

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

WEIGHTS 可以设置每个集合的权重,意为在原来集合分数乘权重得到输出集合的值。两个集合并集时,云服务器提供商如果有相同的key,则可以通过 SUM|MIN|MAX 进行控制。默认为SUM。

复制127.0.0.1:6379> ZUNIONSTORE broadcast:week:1 2 broadcast:1 broadcast:2 (integer) 3 127.0.0.1:6379> ZRANGE broadcast:week:1 0 -1 WITHSCORES 1) "wangwu" 2) "5" 3) "lisi" 4) "10" 5) "zhangsan" 6) "15"1.2.3.4.5.6.7.8.9.

Java实现排行榜

要实现一个排行榜,我们需要做以下几件事:

创建一个ZSet,其中包含用户ID和对应的分数。获取排行榜数据,并按照分数降序排列。

以下是一个简单的Java代码示例,展示了如何使用Jedis库来实现基于Redis的ZSet的秒级排行榜

复制public class RedisZSetRank{ @Autowired private RedisTemplate redisTemplate; // 添加用户分数到排行榜 public void addScore(String userId, double score) { redisTemplate.opsForZSet().add("ranking",userId,score); } // 获取排行榜数据 public Set<String> getRanking() { // 获取前10名 return redisTemplate.opsForZSet().reverseRange("ranking", 0, 10); } // 查看某条记录的排名 public Long ranking(String code) { Long ranking = redisTemplate.opsForZSet().rank("ranking", code); if (ranking != null) { //有序集合的索引是从0开始的,所以查询出来的排名要+1。 return ranking + 1; } return ranking; } public static void main(String[] args) { // 添加用户分数 rank.addScore("user1", 100); rank.addScore("user2", 200); // 获取排行榜数据 Set<String> rankingData = rank.getRanking(); for (String userId : rankingData) { System.out.println("User ID: " + userId); } } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.

这样就实现了简单的排行榜。

总结

Redis 的有序集合 Sorted Set中的成员是唯一的,但分数(score)却可以重复,这一点恰恰可以被我们用来实现排行榜的功能。服务器租用

随机为您推荐
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by Redis 实现排行榜,看这篇文章就够了,益强智未来  滇ICP备2023006006号-17sitemap

回顶部