首页
首页 教程 派聪明
  • 首页
  • 教程
  • 派聪明
  • 登录
登录技术派畅享更多权益

用户名密码登录

其他登录:
icon_GitHubCreated with sketchtool.
绑定星球,畅享VIP服务

微信扫码/长按识别登录

输入验证码
有效期五分钟 👉 手动刷新

登录即同意 用户协议 和 隐私政策

绑定二哥编程星球,畅享 VIP 尊享服务!

戳我了解如何获取星球编号,新窗口打开

添加二哥微信 itwanger 审核更快

记得备注 星球编号
我会根据星球编号进行审核
1
如何学习技术派?
更新时间: 2023年11月28日
星球
2
技术派的架构设计是什么样的?
更新时间: 2023年03月22日
星球
3
如何整合本地缓存 Caffeine?
更新时间: 2023年03月15日
星球
4
整合 RabbitMQ
更新时间: 2023年05月15日
星球
5
给 RabbitMQ 添加连接池
更新时间: 2023年05月23日
星球
6
如何保证缓存一致性?
更新时间: 2023年05月15日
星球
7
如何实现在线人数统计?
更新时间: 2023年03月25日
星球
8
MySQL同步ES
更新时间: 2023年06月09日
星球
9
redis实现活跃排行榜
更新时间: 2023年08月21日
星球
10
实例演示如何实现性能优化
更新时间: 2023年08月30日
星球
11
十二种性能优化方案实战
更新时间: 2023年11月21日
星球
12
配置 SSL 证书
更新时间: 2023年11月21日
星球
13
ngrok内网穿透访问本地服务
更新时间: 2023年12月01日
星球
14
上传图片至 OSS
更新时间: 2023年12月04日
星球
15
如何渲染 markdown
更新时间: 2023年12月20日
星球
16
如何将技术派写到简历上?
更新时间: 2023年11月10日
星球
17
技术派的 Redis 分布式锁
更新时间: 2024年10月22日
星球
18
Linux 一键源码部署技术派
更新时间: 2024年11月12日
星球
19
如何接入微信支付?
更新时间: 2024年12月11日
星球
20
整合FastExcel导出500万条数据
更新时间: 2024年12月19日
星球
21
接入 deepseek API
更新时间: 2025年02月07日
星球
关注公众号
原创
技术派之基于redis实现用户活跃排行榜

排行榜是一个很常见的需求场景了,当然对应的技术选型方案也可以说非常成熟,在技术派项目中,我们也引入了一个用户活跃度的排行榜,主要是基于redis的zset数据结构来实现,给大家实例演示一下,如何实现一个生产可用的排行榜

方案设计

在具体的代码介绍之前,先来了解一下业务场景

1. 场景说明

技术派中,提供了一个用户的活跃排行榜,当然作为一个博客社区,更应该实现的是作者排行榜;出于让大家更有参与感的目的,我们以用户活跃度来设计一个排行榜,区分日/月两个榜单

用户活跃度计算方式:

  1. 用户每访问一个新的页面 +1分
  2. 对于一篇文章,点赞、收藏 +2分;取消点赞、取消收藏,将之前的活跃分收回
  3. 文章评论 +3分
  4. 发布一篇审核通过的文章 +10分

榜单:

  • 展示活跃度最高的前三十名用户

实际的榜单效果如下(可以在首页活跃排行榜侧边栏点击进入)

2. 方案设计

排行榜的业务属性比较清晰简单,对应的数据结构也可以很容易设计出来,核心的信息如下

存储单元

表示排行榜中每一位上应该持有的信息如下

// 用来表明具体的用户
long userId;
// 用户在排行榜上的排名
long rank;
// 用户的历史最高积分,也就是排行榜上的积分
long score;

数据结构

排行榜,一般而言都是连续的,借此我们可以联想到一个合适的数据结构LinkedList,好处在于排名变动时,不需要数组的拷贝

arch

上图演示,当一个用户活跃度改变时,需要向前遍历找到合适的位置,插入并获取新的排名, 在更新和插入时,相比较于ArrayList要好很多,但依然有以下几个缺陷

问题1:用户如何获取自己的排名?

使用LinkedList在更新插入和删除的带来优势之外,在随机获取元素的支持会差一点,最差的情况就是从头到尾进行扫描

问题2:并发支持的问题?

当有多个用户同时更新score时,并发的更新排名问题就比较突出了,当然可以使用jdk中类似写时拷贝数组的方案

上面是我们自己来实现这个数据结构时,会遇到的一些问题,当然我们的主题是借助redis来实现排行榜,下面则来看下,利用redis可以怎么简单的支持我们的需求场景

3. redis使用方案

这里主要使用的是redis的ZSET数据结构,带权重的集合,下面分析一下可能性

  • set: 集合确保里面元素的唯一性
  • 权重:这个可以看做我们的score,这样每个元素都有一个score;
  • zset:根据score进行排序的集合

从zset的特性来看,我们每个用户的积分,丢到zset中,就是一个带权重的元素,而且是已经排好序的了,只需要获取元素对应的index,就是我们预期的排名

排行榜实现

接下来我们看一下技术派中的活跃排汗榜单是如何实现的

核心包路径:com.github.paicoding.forum.service.rank

核心代码实现:com.github.paicoding.forum.service.rank.service.impl.UserActivityRankServiceImpl

1. 更新用户活跃积分

我们先实现一个更新用户活跃的方法,首先定义一个涵盖上面业务场景的参数传递实体ActivityScoreBo

接下来我们先思考一下,这个具体的应该怎么实现,先梳理实现的业务流程

  1. 根据业务实体,计算需要增加/减少的活跃度
  2. 对于增加活跃度时:
  • 2.1 做一个幂等,防止重复添加,因此需要判断下之前有没有重复添加过相关的活跃度
  • 2.2 若幂等了,则直接返回;否则,执行更新,并做好幂等保存
  1. 对于减少活跃度时:
  • 3.1 判断之前有没有加过活跃度,防止扣减为负数
  • 3.2 之前没有扣减过,则直接返回;否则,执行扣减,并移除幂等判定

上面的业务逻辑清晰之后,在看一下我们实现的关键要素

    已加入二哥编程星球,即刻绑定星球编号解锁🔐

    该文档仅「二哥编程星球」的VIP用户可见

    二哥的编程星球内容包括:

    1. 付费文档: 技术派、MYDB 等项目配套的 120+篇教程查看权限

    2. 面试指南: 校招、社招的 40 万+字面试求职攻略

    3. 智能助手: 无限期使用派聪明 AI 助手,已对接讯飞星火和 ChatGPT双通道,不用花 1 分钱

    4. 专属问答: 向二哥 1v1 发起提问,内容不限于 offer 选择、学习路线、职业规划等

    5. 简历修改: 提供简历修改服务,附赠星球 100+优质简历模板可供参考

    6. 学习环境: 打造一个沉浸式的学习环境,有一种高考冲刺、大学考研的氛围


    二哥的星球

    》步骤①:微信扫描上方二维码,点击「加入知识星球」按钮

    》步骤②:访问星球置顶帖球友必看: https://t.zsxq.com/11rEo9Pdu,获取项目配套文档的语雀访问地址和密码

    已加入星球,绑定星球编号
    删除提醒

    确定删除《技术派之基于redis实现用户活跃排行榜》吗

    7人已点赞

回复