技术派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 北京

相关推荐

2025-12-09 01:17
已编辑
湖南工程学院 Java
(项目是苍穹外卖和仿12306)1 自我介绍2 是否参加过实习3 项目拷打(讲一下值得讲的项目,讲一下你对sentinel的认识,底层原理以及设计思路)4 concurrentHashmap相对于普通的HashMap有什么特点,在什么场景下会做加锁5 有了解过renntrantlock吗,和syc比较一下6 就是如果给你一段慢查询,你是从哪些方面入手去做性能优化7 索引的底层数据结构是什么8 为什么要满足最左匹配原则才能让这个索引失效吗?9 开窗查询10 写一个自定义的一个注解吗?11 有在项目里面去去调用三方接口吗12 项目中一般是用什么组件去发送这个http请求的13 简单介绍一webShocked是怎么去发送请求的14 有没有听说过一个叫redissTemplate的15 那如果在项目中要使用redis的话,要做哪些配置呢16 如何在redis自定义序列化器17 Redis有哪些数据结构18 有没有了解设计模式19 mybatis查询缓存结构20 mybatis的几大基本组件21 如何实现一个拦截器22 有了解过kafka吗23 为什么项目用rocketmq而不是kafka24 反问总结:面试官很耐心,问的八股偏多,我有很多问题回答的一般个人不足:1 八股学习的不够深入,没有完全了解底层原理,不能很好地记忆下来,问到关于mybatis时只记得概念并没有完整回答出来,还有concurrentHash虽然回答出来了,但是比较支支吾吾,说明理解不够深入…2 还有些知识盲区,kafka和设计模式等不会3 对项目的技术栈学习不够重视,经不住拷打4 回答问题时太紧张,支支吾吾,脑子里只记得概念,不知道从哪里说起,每次说的话都不能完整流畅说出来要提高的地方1 加强深入学习,背八股的同时去看相关视频讲解了解底层原理,不是死记硬背2 扩大学习范围,学习设计模式等3 多去了解项目所用到技术栈的底层原理,与业务结合4 背八股的时候要想一下面试的时候该怎么完整的回答问题,想一下怎么完成回答的逻辑
查看25道真题和解析
点赞 评论 收藏
分享
评论
1
7
分享

创作者周榜

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