【Redis】使用Redis set实现点赞功能

283 阅读1分钟

我们最开始设想的点赞功能如下:

public Result updateBlogLikes(@PathVariable("id") Long id) {
    //修改点赞数量
    blogService.update().setSql("liked = liked +1 ").eq("id",id).update();
    return Result.ok();
}

但是该代码会导致一个用户可以无限地为一篇笔记点赞,显然不符合实际的业务需求。

所以,需求如下:

  1. 同一个用户只能点赞一次,再次点击则取消点赞
  2. 如果当前用户已点赞,那么点赞按钮需要高亮显示

实现步骤:

  1. 给Blog类中添加一个isLike字段,标示是否被当前用户点赞
  2. 修改点赞功能,利用Redis的set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1
  3. 采用set集合可以对点赞用户进行去重,已点赞的用户存在于某笔记对应的set集合中,则不能再次点赞
public Result updatelikeBlog(Long id) {
    // 1.获取登录用户
    Long userId = UserHolder.getUser().getId();
    // 2.判断当前登录用户是否点赞
    String key = BLOG_LIKED_KEY + id;
    Boolean isMember = template.opsForSet().isMember(key, userId.toString());
    if (BooleanUtil.isFalse(isMember)) {
        // 3.如果未点赞
        // 3.1 数据库点赞数+1
        boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();
        // 3.2 保存用户到Redis的set集合中
        if (isSuccess) {
            template.opsForSet().add(key, userId.toString());
        }
    } else {
        // 4.如果已点赞
        // 4.1 数据库点赞数-1
        boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();
        // 4.2 把用户从Redis的set集合中移除
        if (isSuccess) {
            template.opsForSet().remove(key, userId.toString());
        }
    }
    return Result.ok();
}