这是我参与「第五届青训营」笔记创作活动的第5天
在我们的项目中,我有负责点赞功能接口的设计与实现,之前写过点赞接口,但基本都是直接操作数据库,这次使用了redis,本人菜鸟一枚,如有问题,烦请指正。
1.本文重点内容
- 1.我对点赞功能的设计
- 2.简单代码实现
2.我对点赞功能的设计
2.1 主要的两部分
- 判断用户是否给这个视频点赞,主要存视频id与用户id 以下简称video_user
- 判断这个视频有多少点赞 主要存视频id与点赞数 以下简称video_likenum
2.2 redis类型的选择
- 在video_user中,我选择使用的是Set类型,video与用户是1对多的关系
- 在video_likenum, 我选择使用的HASH类型,vdeo与点赞数是1对1关系
2.3 点赞主要逻辑
- 用户点击点赞操作
- 后台获取传过来的videoid与userid
- 判断redis中是否有对应的videoid与userid
- 如果有 用户进行的是取消点赞操作
- 删除redis中的关联
- 如果没有
- 先访问数据库看是否有
- 如果有 用户进行的是取消点赞操作
- 删除数据库中的关联
- 如果没有 用户进行点赞操作
- 新增关联到redis
- 定时将redis中的数据批量存到数据库
2.4 流程图
2.5 统计点赞数主要逻辑
- 判断用户进行的是点赞操作还是取消点赞操作
- 查看redis中是否有此视频id的对应关系
- 如果有
- 对对应键值的value值加一或者减一
- 如果没有,访问数据库,将对应的id与点赞数+1或者减一存放在redis中
3.简单的代码
//判断当前用户是否点赞
result, err := redis.SIsMember(context.Background(), consts.FavoriteActionPrefix+strconv.FormatInt(req.VideoId, 10), strconv.FormatInt(claims.UserId, 10)).Result()
// redis数据库中删除关联
_, err1 := redis.SRem(context.Background(), consts.FavoriteActionPrefix+strconv.FormatInt(req.VideoId, 10), strconv.FormatInt(claims.UserId, 10)).Result()
//将视频总点赞数减一
_ = favutil.LikeNumDel(req.VideoId)
// 在数据库中查询点赞信息
first, _ := q.WithContext(context.Background()).TFavorite.Where(favorite.UserID.Eq(claims.UserId), favorite.VideoID.Eq(req.VideoId)).First()
// 将点赞存入redis
redis.SAdd(context.Background(), consts.FavoriteActionPrefix+strconv.FormatInt(req.VideoId, 10), strconv.FormatInt(claims.UserId, 10), 0)
//将视频总点赞数加一
_ = favutil.LikeNumAdd(req.VideoId)