当前位置:首页 > 后端开发 > 正文

java点赞怎么实现

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: 采用最终一致性方案:读操作优先访问从库获取近似值,写操作强制走主库并异步复制到从库,对于强一致性要求的场合,可在应用层引入版本号

0