上一篇
java点赞怎么实现
- 后端开发
- 2025-09-09
- 3
va实现点赞功能需设计数据库存储
点赞记录,后端提供接口处理点赞/取消操作,前端更新状态并同步显示计数。
是使用Java实现点赞功能的详细步骤,涵盖数据库设计、接口逻辑、缓存优化及典型场景处理方案:
数据库设计
表名 | 字段说明 | 作用 |
---|---|---|
likes |
id (主键), user_id , target_id , target_type (如文章/评论), created_at |
存储用户点赞记录 |
articles |
id , content , like_count (实时维护的总点赞数) |
关联业务主体数据 |
article_user_thumb |
user_id , article_id , is_liked (布尔值标记状态) |
快速判断用户是否已点赞过某内容 |
- 核心思想:通过多表关联实现数据隔离与高效查询,当用户取消点赞时,可直接更新
likes
表中对应行的删除状态,同时触发articles.like_count
字段的递减操作,这种设计避免了频繁的联表查询,尤其在高并发场景下能显著提升性能。
后端服务层实现
接口定义
@PostMapping("/toggleLike") public ResponseEntity<?> toggleLike(@RequestBody LikeRequest request) { // 参数校验:检查user_id和target_id是否存在且合法 // 根据target_type区分处理不同业务的点赞逻辑 }
- 关键逻辑:先查询是否存在现有点赞记录(防止重复点赞),若存在则执行删除并减少计数器;否则插入新记录并增加计数器,此处建议使用数据库事务保证原子性操作。
分布式锁机制(可选)
针对同一资源的并发请求,可采用Redis分布式锁:
String lockKey = "lock:like:" + targetId; Boolean acquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "LOCKED", 3, TimeUnit.SECONDS); if (acquired != null && acquired) { try { // 执行核心业务逻辑 } finally { redisTemplate.delete(lockKey); } } else { throw new ServiceException("操作过于频繁,请稍后再试"); }
此方案能有效避免超卖问题,但需注意锁粒度与系统吞吐量的平衡。
缓存策略
推荐采用“写透+异步回填”模式:
| 层级 | 技术选型 | 更新时机 |
|—————-|—————————-|———————————-|
| L1缓存 | Redis哈希表 | 用户触发点赞动作时立即更新 |
| L2缓存 | Caffeine本地缓存 | 定时任务批量同步低频访问数据 |
| 兜底存储 | MySQL集群 | 作为最终一致性保障 |
示例代码片段:
// 使用Redis Incr命令实现原子计数器自增 Long currentCount = stringRedisTemplate.opsForValue().increment("post:likes:" + postId); // 同时向二级缓存写入最新值(TTL设置可根据业务特点动态调整) caffeineCache.put("post:" + postId, currentCount);
前端交互优化
即时反馈机制
- 无等待提交:前端先本地切换按钮状态(如变为红色爱心图标),再异步发送请求,即使网络延迟也能保证用户体验流畅性。
- 防抖处理:对连续快速点击行为进行限流,通常采用lodash的debounce函数包装事件处理器。
状态同步补偿
当因网络抖动导致前后端状态不一致时,可通过WebSocket建立长连接通道,由服务端主动推送最新状态到客户端,这需要配合心跳检测机制维持连接活性。
特殊场景处理
热key防护
对于明星博主发布的爆款内容,其点赞功能可能成为系统瓶颈点,此时应采取以下措施:
- 流量削峰:将突发请求导入消息队列(如Kafka),由消费者线程池平稳消费。
- 降级策略:当检测到某个资源的QPS超过阈值时,自动切换至静态页面展示近似值(如显示“999+”)而非精确数字。
反科技机制
通过IP归属地、设备指纹等信息构建风控模型,识别异常点赞行为模式,同一设备短时间内大量点赞不同内容,可判定为机器刷量并加入黑名单。
性能监控指标
指标名称 | 监控目的 | 告警阈值建议 |
---|---|---|
QPS | 评估系统承载能力 | >5000触发扩容预案 |
RT百分位 | 识别慢请求链路 | P99>2s需优化SQL或缓存策略 |
缓存命中率 | 衡量缓存有效性 | <80%考虑调整缓存键规则 |
数据库连接池利用率 | 发现资源争抢热点 | 持续高于90%达5分钟即预警 |
FAQs
Q1: 如何防止用户重复点赞同一内容?
A: 在业务层进行双重校验:①查询likes
表是否存在对应记录;②利用Redis的SETNX命令实现分布式去重,两者结合可最大限度避免跨进程重复提交问题。
Q2: 如果遇到数据库主从延迟导致计数不准怎么办?
A: 采用最终一致性方案:读操作优先访问从库获取近似值,写操作强制走主库并异步复制到从库,对于强一致性要求的场合,可在应用层引入版本号