redis实现高并发点赞与排行榜的核心是:点赞用string+lua脚本保证“检查-设置-计数”原子性,排行榜用zset实时维护top n,数据异步回写mysql并定时校验,辅以令牌桶限流和本地缓存降级。

在 Java 项目中,用 Redis 实现高并发点赞和排行榜,核心是利用 Redis 的原子操作、有序集合(ZSet)和内存高速读写特性,避开数据库锁和频繁 IO。关键不在于“能不能做”,而在于“怎么设计才能扛住流量、不丢数据、结果准确”。
点赞:用 Redis String + Lua 脚本保证原子性
直接对数据库 update count 容易超卖或漏计;用 Redis 的 INCR 或 DECR 虽快但无法区分用户是否重复操作。正确做法是:用 Redis String 存“用户-内容”唯一键(如 like:post:123:user:456),配合 Lua 脚本实现“检查+设置+计数”三步原子执行。
- 脚本里先 EXISTS 判断是否点过,没点过才 SET 并 INCR 总数 key(如 like:post:123:count)
- Java 中用 RedisTemplate.execute() 执行 Lua,返回值表示是否新增点赞(便于前端更新按钮状态)
- 设置合理过期时间(如 30 天),避免冷数据长期占内存
排行榜:用 Sorted Set 实时维护 Top N
别用 MySQL order by limit 做实时榜单——每秒几百次查询会拖垮 DB。Redis ZSet 天然支持按 score 排序、范围查询、增删改 O(log N)。把“内容 ID”作为 member,“点赞数”作为 score,一条命令搞定实时排行。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 每次点赞成功后,用 ZINCRBY like:rank 1 "post:123" 更新分数
- 查前 100 名: ZREVRANGE like:rank 0 99 WITHSCORES(倒序,最新热帖优先)
- 支持多维度榜单:比如按“24 小时增量”单独存一个 ZSet(key 加时间戳后缀),用 ZUNIONSTORE 合并周期榜
数据一致性:异步回写 + 定时补偿
Redis 是缓存,不是唯一数据源。点赞数最终要落库,但不能同步写 DB——否则失去高并发意义。策略是:
- 点赞成功只写 Redis,返回前端“已生效”
- 用消息队列(如 Kafka/RocketMQ)或定时任务,将变更批量回写 MySQL(例如每 5 秒聚合一次增量)
- 加一层“校验任务”:每天凌晨比对 Redis 和 DB 的总点赞数,自动修复偏差(实际线上偏差率通常低于 0.01%)
防刷与降级:加令牌桶 + 本地缓存兜底
真实场景中,机器人刷赞、突发热点导致 Redis 压力飙升。需主动限流和容错:
- 用 Redis + Lua 实现分布式令牌桶,单用户每分钟最多点 5 次(key:rate:like:user:456)
- 排行榜接口加 Caffeine 本地缓存(TTL 10s),缓存 ZREVRANGE 结果,减轻 Redis 压力
- Redis 故障时,降级为查 MySQL 的“准实时榜”(带 5 分钟延迟),保证功能可用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










