新闻详情

新闻详情

首页 / 资讯中心 / 详情

Redis 实现播放量原子计数 + 定时任务同步 MySQL

发布时间:2026/9/25 21:38:02来源:尧图网络
Redis 实现播放量原子计数 + 定时任务同步 MySQL
一、业务场景做音乐网站项目每一次用户点击歌曲播放就需要该歌曲播放数加一。 假设并发量上来如果每一次播放请求直接 update 修改 MySQL。大量访问会频繁触发数据库写操作数据库压力会很高。于是想到使用 Redis 做中间缓存。播放先写到 Redis隔一段时间批量同步回 MySQL减少直接操作数据库的次数。二、实现思路1.用户点击播放后端接收请求2. 使用 Redis INCR原子命令对对应歌曲 id 的播放计数自增 1INCR 是原子操作不用担心并发冲突3. 开启 SpringBoot 定时任务每隔一段时间读取 Redis 里面所有歌曲播放增量4. 将增量批量更新 MySQL同步完成之后清空 Redis 里面已经落库的增量数据。注意隐患如果服务器突然宕机。Redis 还没来得及同步的数据会有丢失风险。 解决思路可以开启 Redis 持久化 RDB/AOF 降低丢数概率或者缩短定时任务间隔时间。三、核心关键代码片段1.播放量自增接口使用 RedisTemplate//歌曲id播放一次计数1 // redisKey格式play:count:{songId} String key play:count: songId; redisTemplate.opsForValue().increment(key);2.定时任务Scheduled每 10 分钟执行一次同步逻辑Component EnableScheduling public class PlayCountSyncTask { Resource private RedisTemplateString,Object redisTemplate; Resource private SongMapper songMapper; Scheduled(fixedDelay 10 * 60 * 1000) public void syncPlayCountToMysql(){ //1.查询redis中所有play:count开头的key //2.循环取出歌曲id和增量 //3.批量update mysql播放数量 //4.同步成功删除redis里面这一批key } }定时任务不要写太短间隔频繁同步就失去 Redis 缓冲意义太长宕机丢数风险变大。四、Redis‑MySQL 缓存不一致问题我们这套方案Redis 暂存增量定时任务批量同步。这是异步更新天然就容易出现缓存和数据库不一致。4.1当前项目会出现不一致的两种场景1.还没到定时同步时间MySQL 直接修改歌曲播放量后台手动改数据库数值。Redis 里面还保留旧增量同步之后就会叠加造成播放数量出错。2.定时任务执行一半程序宕机定时任务遍历一批 key一部分同步成功入库还没来得及删除 Redis 里对应的 key服务宕机。服务重启后定时任务再次执行会把这部分增量再次同步一遍造成播放量重复累加数据变多。注意普通用户点击播放只会往 Redis 做 increment不会直接写 MySQL。普通播放不会产生不一致人为修改 MySQL 才是不一致主要来源。4.2几种解决思路方案 1业务约束业务上约定所有播放量修改只能走 Redis。后台不允许直接手动修改 MySQL 播放量字段。优点实现零代码改动。适合课程演示。缺点现实生产环境很难强制所有人不碰数据库。方案 2更新 MySQL 同时主动清理对应 Redis Key如果后台需要修改歌曲播放量管理员编辑修改 MySQL 播放数字立刻删除该歌曲对应的play:count:{songId}这个 Redis key。Redis 这条增量作废。下一次定时任务不会再把旧增量刷进去。优点简单好实现。缺点如果删除 Redis 网络超时失败不一致仍然会发生。方案 3记录增量日志不要直接用 Redis 存最终增量数字。Redis 只记录变更。或者数据库新建一张增量日志表。每次播放除了 Redis 自增插入一条增量日志。定时任务读取日志表同步同步完标记已处理。就算 Redis 宕机数据库日志还留存记录不会丢数据。优点解决宕机丢数减少不一致风险。缺点每一次播放都插入数据库又增加数据库 IO违背最开始减轻数据库压力初衷。五、强一致 vs 最终一致如果业务强行要求强一致性该怎么办本项目 Redis 暂存增量定时同步只能保障最终一致性。若业务场景余额等要求强一致优先方案放弃 Redis 做计数缓冲读写直接访问 MySQL。牺牲一部分吞吐量换取数据准确。分布式事务 Seata 理论可实现事务回滚但是 Redis 不支持 XA 协议工程落地麻烦很少用于解决 Redis‑MySQL 一致性。六、思考总结“不存在优雅、高性能的方案让 Redis 与 MySQL 保证强一致性。工业上的思路是业务选型规避这个难题。如果要求强一致就不要把写逻辑交给 Redis如果想用 Redis 扛住高并发写压力就要接受最终一致性。”如果非要强一致又想要高性能可以换专门组件例如 Redis 本身的 Redisson 的 RLock 只是锁锁只能减少并发冲突锁解决不了网络故障导致双写不一致。锁≠强一致。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

如何为 MaaEnd 贡献代码:从搭建环境到提交第一个 PR 的完整指南 2026/9/25 22:13:28

如何为 MaaEnd 贡献代码:从搭建环境到提交第一个 PR 的完整指南

如何为 MaaEnd 贡献代码:从搭建环境到提交第一个 PR 的完整指南 【免费下载链接】MaaEnd MaaEnd 终末地小助手:基于视觉 AI 的「明日方舟:终末地」自动化工具 项目地址: https://gitcode.com/gh_mirrors/maa/MaaEnd MaaEnd 终末地小助…

阅读更多 →
邹平省心的新房装修设计公司实力与用户口碑 2026/9/25 22:13:20

邹平省心的新房装修设计公司实力与用户口碑

淄博业之峰家园装饰有限公司是淄博本土深耕家装行业的正规服务商,成立24年来始终立足淄博本地需求,为各类家装业主提供全流程的品质装修服务,其核心定位是做淄博人值得托付的良心家装品牌,主营别墅装修、新房装修、老房改造、大平…

阅读更多 →
YouTube 视频推广怎么做 内容优化广告和服务如何区分 2026/9/25 22:13:20

YouTube 视频推广怎么做 内容优化广告和服务如何区分

选择适合目标的 YouTube 推广方式的数据分析和 96SMM 产品支持 先确定观看、订阅还是业务目标,再选择内容优化、YouTube 或 Google Ads、合作推广或具体第三方项目。不同方式的数据和交付必须分开报告。 本文按“明确问题、完成内容、记录数据、诊断原因、选择支持、…

阅读更多 →
自媒体商用配图,有哪些性价比不错的在线修图工具 2026/9/25 22:12:41

自媒体商用配图,有哪些性价比不错的在线修图工具

自媒体配图早已告别简单拼图、美颜修图的基础需求。如今公众号、小红书、短视频封面、图文推文等场景,都需要高频产出高清、统一风格、可商用的视觉素材。多数自媒体创作者没有专业设计基础,也不愿承担高额软件年费、素材版权费用。在线修图工具无需下载…

阅读更多 →
Atlas 300V推理卡实战:YOLO模型转换与部署全流程 2026/9/25 22:12:12

Atlas 300V推理卡实战:YOLO模型转换与部署全流程

最近不少人在后台问同一个问题:Atlas 300V 24G到底是不是运算加速卡,它和常见的GPU显卡有什么区别?还有人直接说想在Atlas上部署YOLO,但模型转换、算子支持、推理流程这些地方被卡得一头雾水。我把这两件事放到一起聊,…

阅读更多 →
Java开发必备的10个编码习惯,第7个最易忽略 2026/9/25 22:12:11

Java开发必备的10个编码习惯,第7个最易忽略

在Java开发中,代码写出来容易,写好却难。真正拉开工程师水平的,往往不是对框架的熟练度,而是那些日复一日的编码习惯。下面这10个习惯,看似基础,却能显著提升代码质量。尤其是第7个,很多人直到线…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉