这是我参与「第五届青训营 」伴学笔记创作活动的第 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} $videoIdHINCRBY 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导致无法选中字段。