Redis 实现关注、点赞、评论 | 青训营大项目笔记

295 阅读2分钟

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

在青训营大项目中,有用户的关注、视频的点赞和评论的需求,通过青训营对Redis的学习,对原有的青训营大项目做出修改。

关注

要求:

  • 记录关注
  • 删除关注
  • 记录关注列表
  • 记录粉丝列表
  • 检测是否关注
  • 关注数、粉丝数(被关注数)

在 MySQL 中的实现

可以通过两个表实现,表一记录关注数和粉丝数,表二记录关注记录。

但是,由于关注记录和数量记录使数据库在写压力上大,通过Redis,将数据存在内存,可以快速读写。

在 Redis 中的实现

添加关注

  • 将 TargetId 加入用户的关注列表 - ZADD Follow-UserId:{$userId} $time $targetId
  • 将 UserId 加入目标用户的关注列表 - ZADD Follower-UserId:{$target} $time $userId

取消关注

  • 将 TargetId 加入用户的关注列表 - ZREM Follow-UserId:{$userId} $targetId
  • 将 UserId 加入目标用户的关注列表 - ZREM Follower-UserId:{$target} $userId

关注/粉丝列表

  • 根据 UserId 返回关注列表 - ZRANGE Follow-UserId:{$userId} 0 -1
  • 根据 TargetId 返回粉丝列表 - ZRANGE Follower-UserId:{$targetId} 0 -1

关注/粉丝数

  • 根据 UserId 返回关注数 ZCARD Follow-UserId:{$userId}
  • 根据 TargetId 返回关注数 ZCARD Follower-UserId:{$targetId}

检测是否关注

  • 根据 UserId TargetId 返回加入ZSET的Score ZSCORE Follow-UserId:{$userId} $targetId

使用 ZSET 的原因在于通过 Score 可以记录关注的时间,可以对列表进行时间排序

视频的点赞、评论

要求:

  • 记录点赞列表
  • 记录点赞数、记录评论数

添加点赞

  • SADD Favorite-UserId:{$userId} $videoId
  • HINCRBY VideoId:{$videoId} FavoriteCount 1

SET集合记录用户点赞记录,HASH记录点赞数,VideoId:{$videoId}也用来记录评论数

添加评论

  • 用 MySQL 记录用户评论
  • HINCRBY VideoId:{$videoId} CommentCount 1

HASH记录计数数据,VideoId:{$videoId} CommentCount用来记录评论数,用MySQL记录用户评论是因为SET只能存string,用户评论的数据过多不够存放。

也可以尝试存在Hash中,HSET Comment-VideoId:{$videoId} CommentId-UserId-Time:{$commentId}-{$userId}-{$time} $content,用 HLEN 计数。因为只需要返回列表,用 HGETALL 返回评论列表。但是在删除评论上,只有$commentId、$userId,没有$time导致无法选中字段。