1410f4be36a99dc91a93e97dd18762409252a551
thumb-up
🧐 高并发点赞系统
模块
用户模块
- 登录
- 使用 Session 简单登录
- 用户信息
- 不是本项目讨论的重点,不提供修改
点赞模块
- 校验
- 参数合法性
- 登录态
- 是否已点赞
- 锁
- 多次点赞统一博客场景
- 事务
- 修改两张表,需要保证数据一致性
博客模块
- 获取博客
- 获取博客列表
QA
- 如何从数据库层面杜绝重复数据出现?
答:对于 thumb 表,使用联合唯一索引
CREATE UNIQUE INDEX idx_userId_blogId ON thumb (userId, blogId);
- 为什么要在
BlogServiceImpl导入ThumbService上加@Lazy
答:
- 博客服务中需要使用点赞服务查询博客对应的点赞情况列表以返回对应视图。
- 点赞服务中需要使用博客服务更新单条博客的点赞计数器。
- 两个服务之间产生了循环依赖,Spring Boot 2.6 以后的版本默认不允许循环依赖,这里可以使用懒加载的方式避免这一问题。
- 点赞接口加锁对象是什么?
答:
- 加锁目的是为了避免用户并发请求造成数据不一致。
- 不能对帖子加锁,因为帖子是全局的,加锁会导致其他用户无法点赞。
- 因此需要对用户加锁,故而实际上是将每个用户的 id 当作锁。
- 点赞接口的锁具体如何处理?
答:
synchronized (("LOCK-USERID-" + loginUser.getId().toString()).intern())
- 每个用户持有一个唯一 id,因此考虑把 id 对应的 String 常量池对象加锁。
- 为了避免对程序中其他需要使用该字符串常量的地方产生影响,这里对字符串作出处理
"LOCK-USERID-" + loginUser.getId().toString() - 并且我们需要将字符串放到常量池中,调用
intern()方法。
Languages
Java
100%