【Redis实战】之从0到0.1的评论功能
主要介绍的是思路
如果⼤家有性能更好的⽅案,可以在评论告诉我,谢谢
思考1:评论功能需要哪些⼩功能堆砌?
围绕这个思考,我们可以先简单的思考⼀下,⼀个简单的评论功能,它需要涉及哪些⼩功能
1. 添加评论
2. 删除评论
3. 屏蔽评论
4. 显⽰评论
5. 按发表时间排序
6. 按热度值排序(热度值可以是点赞数,也可以是回复数,还可以是点赞和回复数的总和)
思考2:Redis的哪些数据结构可以满⾜这些功能?
⼀开始想到的基本都是List结构,但是它2个问题
1. 插⼊的顺序,评论是有时间顺序的,插错位置就会导致评论显⽰的顺序有问题
2. ⽆法排序,⽆法根据热度值进⾏排序显⽰热门分页
第⼀个问题,可以通过消息队列顺序消费解决, ⽤户添加评论,直接返回评论成功,客户端假UI显⽰
第⼆个问题,在List的基础上扩展ZSet结构⽤于解决排序问题
思考3:使⽤ZSet结构如何设计评分结构
⾸先要了解ZSet评分的范围,Redis的ZSet数据结构的评分范围正整数最⼤到99999999.99999999(暂时⽤不上负数,所以没去算负数范围)
然后设计评分的结构redis支持的数据结构
例如: 可能需要点赞数来排序,然后点赞数⼀样的情况下需要按发表时间排序
⼩数位⽤于填充时分秒,整数位⽤点赞数和年⽉⽇填充
⽐如: 点赞数100个, 发表时间2020年7⽉30⽇17:06:14
则转换后的评分为 10020200730:170614
则每次点赞或取消点赞需要对评论操作 1000000 / -1000000 的分值
⽐如: 对上⾯的评论再点赞⼀次,则点赞数有101个
10020200730:170614 + 1000000  = 10120200730:170614
思考4:value应该缓存什么?
List和ZSet只缓存评论主键,获取分页时先通过List和ZSet获取主键,然后再根据主键获取评论内容的缓存
思考5:评论的回复数和点赞数是⼀直在变动的,该怎么处理?
在缓存评论内容的时候只缓存不变的内容,⽐如评论ID,评论时间,评论内容
点赞数和回复数都另外⽤Redis计数器处理,读取缓存时同时读取计数器缓存
思考6:删除/屏蔽/显⽰怎么处理
删除和屏蔽都要从List和ZSet中删除主键
⽤户删除⽤硬删,同时级联删除回复
屏蔽⽤软删,不对回复进⾏操作,万⼀⼜显⽰了呢←_←
显⽰评论时,只要重新把评论主键加⼊List和ZSet当中就⾏了
思考7:⾼并发下怎么处理
⾼并发就直接操作Redis(List会有插⼊顺序的问题)
⾄于⼊库有2种⽅式: 1.消息队列操作数据库 2.任务调度定时刷⼊数据库(需要额外记录评论的情况)如果帮到你,请点个赞吧 O(∩_∩)O~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。