redis数据一致性问题还稀里糊涂?看这篇就够了

本文探讨了Redis缓存中数据不一致的常见原因,重点介绍了读写缓存的同步直写和异步写回策略,以及只读缓存的处理方式。通过实例分析了数据不一致的产生过程,并提供了推荐的解决方案,确保数据一致性在实际应用中的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

当我们使用Redis做缓存时,数据不一致问题是绕不过的问题。如果我们没有很好的处理数据一致性问题,就有可能影响用户体验,最严重的会造成业务损失。数据一致性的场景和解决方式都有哪些呢?让我们一探究竟。

缓存和数据库的数据不一致发生原因

数据一致性总结就是2种情况:

  • 缓存中有数据,这时缓存的数据和数据库的相同;
  • 缓存中没有数据,这时数据库的值是最新值。

因此,不符合这2种情况的就是数据不一致了。而缓存又包括读写缓存和只读缓存。 发生数据不一致的情况有各自的区别。

读写缓存

对数据增删改操作时,需要在缓存中进行。同时呢还得根据写回策略,看是否要同步写回到数据库。

  • 同步直写策略:写缓存时,并同步写数据库。缓存和数据库的数据一致。
  • 异步写回策略:写缓存时不同步写数据库,而是等数据淘汰触发时,再将数据写回数据库。此情况下,若未触发数据淘汰就出现故障,数据库就没有最新数据,造成数据不一致的问题。

总结一下,采用读写缓存时,要保证数据一致性问题,就要采用同步直写策略。若数据一致性要求不是很高,可采用异步写回策略。

只读缓存

当要新增数据,就直接写到数据库;当数据删除或修改时,修改数据库的值,并将缓存的数据清除。

分析一下数据一致性的问题:

  • 新增数据:数据直接写到数据库,不对缓存操作。此时不存在一致性的问题。
  • 删除和修改数据:这种情况下,既要更新数据库,也要删除缓存。若两个操作保证不了原子性,就会出现数据不一致问题。

只读缓存删改数据的不一致问题

  • 先删除缓存,再更新数据库:若缓存删除成功,数据库更新失败。后面访问就会缓存缺失,然后访问数据库就会查到旧值。(但数据库更新失败,这种情况此操作就失败了,不能叫旧值)
  • 先更新数据库,再删除缓存:若更新数据库成功,删除缓存失败。后续访问的就是缓存中的旧值。

看上图很好理解这个数据不一致的产生过程:

  1. a旧值=1,客户端要更新a的值为2;
  2. 先更新数据库成功,此时数据库a = 2;
  3. 再删除缓存,但失败了。缓存还在。此时缓存中a = 1, 数据库中a = 2;
  4. 再去查询a的值。因缓存命中,返回a = 1,和数据库不一致。

数据不一致的解决方案

处理方式一:先删除缓存,再更新数据库。(不推荐)

发生数据不一致的场景:

  1. 线程1删除缓存中的a数据后,还没来得及更新数据库。
  2. 此时线程2读取数据a,会发现缓存缺失,然后会去读数据库。

线程2去数据库读取这个动作会带来2个问题:

  • 线程2读取的a是旧值(因为线程1已经改了a的值,只是还没更新到数据库)
  • 线程2在缓存缺失时读了数据库的旧值,这也就算了,它还会将这个旧值回写到缓存中。后续读取a可能都会读到旧值。

这种处理方式很容易造成数据不一致的问题,而且可能会影响后续多个查询操作。很多教程有提供延迟双删的解决方案(线程1更新完数据库后,先sleep一段时间,再进行一次缓存删除操作),这种sleep的方式无法准确预估其他多个线程开始和结束的时间。还是可能会产生数据不一致问题。个人建议别使用这种处理方式。

处理方式二:先更新数据库,再删除缓存。(推荐)

发生数据不一致的场景:

  • 若线程1删除了数据库的值a,但还没来得及删除缓存。
  • 此时线程2读取a数据,就会命中缓存中a的值,这就是读到了旧值。

但此情况若并发读a的线程不多,影响就不大。因为线程1马上就会将缓存中的a删除。后续读取a时就会出现缓存缺失,然后去数据库读a的最新值。对业务的影响较小。

总结

在Redis的缓存和数据库的数据不一致问题上,可分为读写缓存只读缓存来分析。

读写缓存有同步写回策略异步写回策略。采用同步写回能保证数据一致性,若数据一致性要求不是很高,可采用异步写回策略。

只读缓存有2种处理方式:

  • 先删除缓存,再更新数据库(不推荐):并发请求多的时候,容易产生缓存和数据库值不一致的情况。
  • 先更新数据库,再删除缓存(推荐):并发请求多的时候,会存在短暂的数据不一致问题。

### 寻找具有商业价值的Java开发项目 #### 客户关系管理系统 (CRM) 客户关系管理系统的构建能帮助企业更好地管理和优化与客户的互动。通过集成销售、市场和服务流程,可以显著提高企业的运营效率和客户满意度。 - **项目背景**:随着市场竞争加剧,企业越来越重视客户服务的质量。 - **项目目标**:建立一个全面的企业级客户关系管理系统,支持多渠道沟通并提供数据分析能力。 - **主要功能**: - 销售自动化 - 市场营销活动跟踪 - 客服工单处理 - 数据挖掘与报表生成 - **关键技术点**: - Spring Boot框架用于快速搭建微服务架构[^4] - 使用MyBatis实现持久层操作 - Elasticsearch进行全文检索加速查询性能 - WebSocket实现实时消息推送通知机制 - **测试策略**:单元测试结合接口自动化测试确保稳定性;UI层面采用Selenium工具模拟真实用户行为验证界面逻辑正确性。 - **部署方案**:Docker容器化打包应用程序及其依赖环境,Kubernetes集群编排调度资源分配。 ```java // 示例代码片段展示如何配置Spring Boot中的WebSocket连接 @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } ``` #### 社交博客系统 社交博客平台允许个人创建个性化空间分享生活点滴或专业知识见解,促进社区交流互动。 - **项目背景**:社交媒体已经成为人们日常生活中不可或缺的一部分。 - **项目目标**:打造一款集成了社交网络特性的在线作平台,鼓励原创内容创作传播正能量价值观。 - **核心模块**: - 用户注册登录认证授权体系 - 文章发布编辑器插件集成富文本格式支持 - 关注好友动态流推荐算法模型训练调优 - 私信聊天室群组讨论区等功能拓展用户体验感 - **技术选型建议**: - 后端选用Node.js配合Express框架来编RESTful API接口 - Vue.js前端框架负责页面渲染交互效果呈现给终端使用者 - Redis缓存热点数据减少数据库访问压力提升响应速度 - Nginx反向代理服务器负载均衡分发请求流量至不同实例节点上运行的服务程序副本之间平衡工作负荷 - **质量保障措施**:Jenkins持续集成流水线自动触发每次提交后的静态代码审查任务以及回归测试计划执行情况反馈报告统计图表可视化展现缺陷修复进度趋势变化规律特征总结归纳经验教训指导后续版本迭代升级规划决策制定依据参考资料来源出处说明引用标记 ```javascript // Node.js Express路由定义样例 const express = require('express'); const router = express.Router(); router.get('/posts', function(req, res){ // 获取文章列表业务逻辑... }); module.exports = router; ``` #### 房屋租赁系统 房屋租赁信息系统旨在简化租房过程,为房东和租客提供便捷的信息匹配服务平台。 - **项目背景**:城市化进程加快使得住房需求日益增长,传统中介模式存在诸多不便之处亟待改善创新解决方案应运而生满足市场需求空白填补社会痛点解决办法探索尝试新思路新模式新业态发展路径研究探讨实践检验推广普及应用前景展望未来发展趋势预测分析评估结论意见看法观点态度立场表达阐述解释说明论证推理演绎归纳综合概括提炼升华抽象具体形象生动活泼有趣味性吸引力感染力影响力号召力行动指南方向指引原则遵循标准规范要求规定制度政策法规法律条文条款细则细节要点重点难点疑点问题解答解惑答疑释义解读阐释阐明清晰明了通俗易懂简洁精炼言简意赅直截了当开门见山切入主题中心思想主旨大意主要内容概述概要简介介绍引介导论序言开场白前言开头部分主体结构层次分明脉络清楚连贯顺畅自然流畅过渡衔接紧密联系关联呼应照应前后一致协调统一和谐美满圆满完美无缺无可挑剔无可厚非无可争议毋庸置疑毫无疑问确凿无疑铁证如山不容置喙闭口不谈沉默寡言少说两句省得惹麻烦是非曲直黑白分明泾渭分明一清二楚毫不含糊模棱两可似是而非半信半疑将信将疑犹豫不定拿捏不准把握不住吃不准摸不清搞不懂弄不明白稀里糊涂不明就里不知所以然莫名其妙一头雾水丈二和尚摸不着头脑云里雾里晕头转向迷迷瞪瞪昏昏沉沉浑浑噩噩懵懵懂懂恍恍惚惚飘飘忽忽悠悠荡荡摇摇晃晃颤颤巍巍战战兢兢小心翼翼谨小慎微型稳扎稳打步步为营循序渐进按部就班有条不紊井井有序规规矩矩整整齐齐一丝不苟认真细致严谨求实实事求是尊重事实依据证据说话做事讲道理摆事实讲理理论事说理辩理析理解悟彻悟顿悟开窍明白通透豁达开朗心胸宽广气度恢宏大气磅礴气势宏伟壮观壮丽美丽漂亮好看悦目赏心悦目心旷神怡心情舒畅愉快高兴喜悦欢乐幸福甜蜜温馨浪漫诗意诗情画意意境深远悠远绵长韵味无穷回味无穷耐人寻味意味深长含义深刻寓意丰富象征意义隐喻暗示影射反映折射映衬对比对照比较鉴别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值