【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(暂时用不上负数,所以没去算负数范围)

然后设计评分的结构

例如: 可能需要点赞数来排序,然后点赞数一样的情况下需要按发表时间排序

小数位用于填充时分秒,整数位用点赞数和年月日填充

比如: 点赞数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~

你可能感兴趣的:(Redis实战思路,Java,评论功能,Redis)