项目点赞功能 | 青训营笔记

333 阅读2分钟

这是我参与「第五届青训营」笔记创作活动的第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 流程图

图片.png

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)