业务需求
- 点赞 / 取消点赞互斥:同一个用户对同一篇博客只能点赞 1 次;再次点击就取消点赞。
- 前端高亮控制 :后端返回
isLike字段,前端根据这个字段控制点赞按钮是否高亮。
⚠注意:
isLike不存入数据库 ,只是返回给前端的临时标记,代表当前登录用户有没有给这篇博文点过赞,不同用户访问同一篇博客,这个值是不一样的。
Redis 选型:Set 集合
- key 设计:
blog:like:博文id - Set 里面存储点赞用户的 id
- Set 天然去重:同一个用户 id 无法重复存入集合,刚好满足一人只能点一次赞。
完整实现步骤
- 实体类改造 在 Blog 实体增加临时字段
isLike,仅用于向前端返回状态,不映射数据库表。 - 点赞接口业务逻辑
- 获取当前登录用户 ID、被点赞博客 ID
- Redis 中查询该博客对应的 Set 集合,判断用户 ID 是否存在
- ✅不存在(未点赞):把用户 id 加入 Set 集合;数据库点赞数量 + 1
- ✅已存在(已点赞):把用户 id 从 Set 移除;数据库点赞数量 - 1
- 根据 id 查询单篇博客 查询博客数据库记录之后,额外去 Redis 判断:当前登录用户 id 是否在该博文的点赞 Set 集合里
- 如果存在 →
isLike=true - 如果不存在 →
isLike=false把该字段填充到 Blog 对象返回前端。
- 分页查询博客列表 分页拿到一批 Blog 数据之后,遍历每一条博文 ,每条都去 Redis 判断当前用户是否点赞过,给每一条记录设置
isLike,再返回前端。