技术派redis实现用户活跃排行榜学习

首先定义一个参数实体来涵盖业务场景所需要的参数, 如点赞 评论等。

梳理业务流程 :

增加活跃度:先做一个幂等来防止重复加分(创建一个用户行为的哈希表 userAction userAction由用户id和当下时间组成 里面的字段由用户对某一篇文章的具体行为组成 即文章id+用户行为)如果字段不存在 说明当前用户并未进行有关操作 则下一步可以给有关操作字段加分。

减少活跃度:把相关操作字段删除(下次就可以再加回来 比如点赞 取消 再点赞),减去对应的分数。

榜单更新:日榜和月榜,建立两个有序集合,用户id作字段。每次把用户行为产生的分数加进去。同时设置过期时间。

榜单查询:通过有序集合对分数进行排序 再获得用户id 用用户id查询一些用户的简单的信息 呈现在榜单中

同时 作者提出了五个拓展问题

1.如何做防刷?

2.并发问题怎么规避?

3.由非原子的redis操作,引入的事务问题怎么避免?

4.性能测试可以怎么进行?

5.数据量大时存储用户的操作记录内存占用庞大怎么解决?

我的思考如下:

1.对于防刷,可以有简单限流:定义一个变量 如day_limit_praise 记录用户一天点赞文章的数量,并给个上限,超过则对用户进行提示。滑动窗口限流 : 维护一个固定时长的时间窗口(如一分钟)用有序集合 字段和值都是时间 每次有新请求来的时候都更新集合 保证最大间隔只有一分钟 当这个集合超过一定大小 提醒用户。行为模式识别:分析操作序列识别机器人行为。通过list记录用户操作序列 然后遍历分析是否存在大量连续点赞 取消 点赞 取消这样的操作 然后对相应的用户发送验证码并限制操作。

2.redis单线程让它的命令具有天然的原子性 所以zincr本身就是原子操作,不需要额外锁机制 。其他的场景还没学到 先这样吧

3.用lua脚本 使用乐观锁watch

4.使用相关工具 如 JMeter、Gatling。

5.冷热数据分离 对近期的数据存在redis 较早的数据存在mysql 定时归档。 设置合理的过期时间, 动态调整 :每次访问数据都延长它的过期时间

暂时先这样,万能的牛油们能不能给点建议,谢谢!

全部评论
老哥也在学技术派吗,我蹲蹲佬的后续章节的细节
点赞 回复 分享
发布于 2025-05-07 15:18 北京

相关推荐

04-09 13:59
吉林大学 Java
问题 1 请先做个简单的自我介绍,并详细说说你在项目中是如何利用Redis和消息队列处理高并发抢券/秒杀场景的?问题 2你在项目中使用的分布式锁经历了怎样的演进过程?请结合JMeter的压测数据,谈谈最初的Redisson方案是如何实现一人一单的,以及它是怎么处理超卖回滚的?问题 3请详细解释一下Redisson分布式锁中的“看门狗(Watchdog)”机制是如何工作的?它的触发条件和底层续期逻辑是什么?问题 4如果不直接使用Redisson,让你自己手动编码实现一个类似“看门狗”的自动续期机制,你会怎么设计这套逻辑?问题 5既然Redis本身支持设置Key的过期时间,那我们为什么不能直接依赖这个自动过期时间来释放分布式锁?完全依赖超时自动释放会有什么隐患?问题 6在预扣减Redis库存成功后,如果由于网络故障或RabbitMQ宕机导致消息发送失败,数据库没有成功落库,这种情况下的数据不一致问题你是如何保证兜底解决的?问题 7你提到方案经过了优化,请问从纯分布式锁优化为Lua脚本方案后,系统的QPS具体提升了多少?性能翻倍的根本原因是什么?问题 8使用Lua脚本嵌入Redis执行确实能大幅提升并发性能,但在工程实践中,编写和维护Lua脚本存在哪些弊端或需要注意的风险?问题 9你提到项目中大量使用了MyBatis Plus,那么请问MyBatis底层是如何防止SQL注入的?它的核心原理机制是什么?问题 10在使用MyBatis Plus进行数据分页查询时,它的物理分页底层是如何实现的?拦截器(Interceptor)在这里起到了什么核心作用?问题 11框架在进行物理分页时,具体的分页参数(如当前页码、每页大小)在应用层和底层之间是如何封装和传递的?问题 12除了MyBatis Plus,你平时还会去主动研究哪些主流框架的底层源码?能分享一下你最熟悉的框架源码机制吗?问题 13当你在项目中需要引入一个新的中间件或技术栈时,你的学习和落地路径是怎样的?你会如何平衡AI辅助工具和官方文档的使用?问题 14在日常开发排错和遇到复杂的系统性能瓶颈时,你通常会如何利用AI工具?有什么核心决策是你绝对不会完全交由AI去决定的?问题 15你在设计分布式锁的Key时,曾和AI的建议产生过分歧。请结合具体的业务安全场景(如防黑产刷单),谈谈你是如何权衡纯粹的“技术并发度”与真实的“业务安全性”的?问题 16结合你的项目开发经验,谈谈你为什么深度依赖Spring Boot框架?它的核心设计优势(例如自动装配)在底层是如何实现的?问题 17请深入讲解一下Spring的IOC容器是如何管理Bean的生命周期的?特别是遇到带有AOP增强的循环依赖时,三级缓存是如何精妙运作来解决这个死循环问题的?问题 18在处理系统中大量重复的公共字段(如创建时间、更新人)时,你是如何利用自定义注解结合Spring AOP和反射机制,实现无侵入式自动填充的?算法题用java实现lru
查看20道真题和解析
点赞 评论 收藏
分享
评论
1
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务