主要介绍的是思路
如果大家有性能更好的方案,可以在评论告诉我,谢谢
思考1:评论功能需要哪些小功能堆砌?
围绕这个思考,我们可以先简单的思考一下,一个简单的评论功能,它需要涉及哪些小功能
1. 添加评论
2. 删除评论
3. 屏蔽评论
4. 显示评论
5. 按发表时间排序
6. 按热度值排序(热度值可以是点赞数,也可以是回复数,还可以是点赞和回复数的总和)
思考2:Redis的哪些数据结构可以满足这些功能?
一开始想到的基本都是List结构,但是它2个问题
1. 插入的顺序,评论是有时间顺序的,插错位置就会导致评论显示的顺序有问题
2. 无法排序,无法根据热度值进行排序显示热门分页
第一个问题,可以通过消息队列顺序消费解决, 用户添加评论,直接返回评论成功,客户端假UI显示
第二个问题,在List的基础上扩展ZSet结构用于解决排序问题
思考3:使用ZSet结构如何设计评分结构
首先要了解ZSet评分的范围,Redis的ZSet数据结构的评分范围正整数最大到99999999.99999999(暂时用不上负数,所以没去算负数范围)
然后设计评分的结构
例如: 可能需要点赞数来排序,然后点赞数一样的情况下需要按发表时间排序
小数位用于填充时分秒,整数位用点赞数和年月日填充
比如: 点赞数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~