评论优化 | 青训营笔记

101 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第17天

使用redis和rabbitMQ对已有代码进行优化

架构设计

流程图 (1).jpg

主要对service层以下函数逻辑进行优化

// 返回评论数量
GetCommentCnt(videoId int64) (int64, error)
// 发布评论
CommentAction(comment dao.Comment) (Comment, error)
// 删除评论
DeleteCommentAction(commentId int64) error
// 返回评论列表
GetCommentList(videoId int64, userId int64) ([]Comment, error)

优化逻辑设计

  • 定义三个redis数据库来记录视频和评论之间的关系:
// RdbVCid 存储video与comment的关系
var RdbVCid *redis.Client

// RdbCVid 根据commentId找videoId
var RdbCVid *redis.Client

// RdbCIdComment 根据commentId 找comment
var RdbCIdComment *redis.Client
  • 定义一个删除评论的消息队列
var SimpleCommentDelMQ *CommentMQ

发送评论

当接受到用户发送评论的请求,会把commentId、videoId、comment关系分别插入到三个redis数据库中,并设置键的有效时间。

这里comment是一个结构体,需要将结构体序列化,再转为字符串作为value存到对应的redis数据库里。

删除评论

先判断RdbCVid数据库中是否存在commentId为key的记录,如果不存在,直接把删除评论的操作发送给消息队列去做,消费者去数据库执行相应的操作,然后返回。

如果在缓存中,就根据RdbCVid获得commentId对应的videoId。然后对三个redis数据库更新缓存,移除对应的commentId的信息。

返回视频评论数量

直接判断videoId是否存在缓存中,如果不在缓存,去数据库中查询;如果存在直接返回RdbVCid中videoId对应的commentId的数量;

返回评论列表

先判断videoId是否在RdbVCid,如果不在,去数据库查询,然后将videoId对应的commentId集合同步到三个缓存数据库中;如果存在,就去处videoId对应的commentId集合,然后去RdbCIdComment数据库中依次取出对应的commnet,组装好list返回