技术派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 定时归档。 设置合理的过期时间, 动态调整 :每次访问数据都延长它的过期时间

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

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

相关推荐

省流:一共十分钟,全程八股,一点点项目,最后问我有没有竞赛和其他项目,但我都莫得,大概是凉了。1.自我介绍环节2.为什么选择来应聘Java相关的实习呢3.你在项目中负责哪些模块4.你有做过一些复杂的设计吗5.你对SpringBoot了解吗回答:SpringBoot简化了配置的难度,降低了开发人员的开发门槛。@SpringBootApplication有三个注解。@ComponentScan扫描包内的组件,@SpringBootConfiguration代表这是一个配置类,@EnableAutoConfiguration是核心注解,他会扫描META-INF下的Spring.factorires文件,如果你用到了这些组件,就会生成对应的字节码,这个注解根据字节码来加载所需要的Bean文件。6.你有开发过其他的项目吗回答:莫得7.你了解AOP吗,有没有自己用过回答:AOP是面向切面编程,目标是编写高内聚,低耦合的代码。他将与业务无关,但是会对多个对象产生影响的代码抽离出来单独做一个模块,降低了代码耦合,提高了复用性。常见的例子是做事务管理,日志记录,JWT鉴权8.你有自己定义过一些注解吗回答:有的兄弟有的,比如@Log注解,当代码扫描到这个注解的时候,就去调用切点的Around方法,通过反射拿到所需要的类的信息,然后记录到数据库中,实现日志管理功能9.你用过哪些设计模式,有自己写过一些模式吗Java有23种模式,分为创建型,结构性,行为型三类,常用的有单例模式,确保一个类只有一个实体,并提供全局访问,例如数据库连接池,线程池等等结构型用得比较多的是代理模式,比如Spring的AOP的动态代理就是用的这个行为型用得比较多的是观察者模式,用来事件监听,责任链模式用于处理拦截器。10.在校期间有参加过竞赛吗回答:莫得11.为什么要到上海来实习回答:实习我觉得在哪里都可以,中金所技术是中金所的全资子公司,是行业的龙头企业巴拉巴拉。12.还有别的Offer吗回答:还有在流程中(有点蠢,应该表达下对中金所的向往)13.反问环节:实习内容是什么回答:根据部门需要,会分到不同的任务。
牛客63969800...:我也是,他问我有没有实习经历,我就是为了实习经历来实习的😂,建议我先去实习
查看10道真题和解析
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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