当前位置: 首页 > news >正文

缓存分布式一致性问题

        缓存一致性问题发生的原因,是在更新数据时数据库和缓存数据的不一致。我们要做到保证缓存的最终一致性。如果数据需要强一致性建议直接查询数据库。

双写模式

双写模式为先写数据库,在写缓存。

        进来两个请求,先执行“请求1”的操作写入数据1,这时可能由于各种原因,“请求1”卡顿。这时候我们的“请求2”执行写数据库为2,更新缓存为2。“请求1”卡顿结束继续写缓存为1。现在出现问题,我们的缓存本该为2,现在却是1,出现了脏数据

脏数据问题:

        暂时性脏数据,但是数据是稳定的,缓存过期后,又能得到最新的正确数据。

保证的是最终一致性

失效模式

        写数据库后删除缓存,当有用户查询时缓存为空,更新添加缓存。

        “请求1”在写完数据1后删除缓存。“请求2”在写缓存时如果出现比较慢的情况,这是进来“请求3”的查询操作,读取缓存为空,然后读取数据库为1。

        这时候执行有一个情况,“请求2”写完数据库,执行删除缓存。“请求3”更新缓存,那么这时候更新缓存数据为1,与数据库中最新的2不一致,出现一致性问题

脏数据问题:

        暂时性脏数据,但是数据是稳定的,缓存过期后,又能得到最新的正确数据。

缓存数据一致性解决方案

双写模式或者失效模式都会导致缓存不一致问题的出现。那么怎么处理?

        1.如果是用户纬度的数据,并发几率小,可以不用考虑大并发出现的一致性问题,缓存加上过期时间,每隔一段时间触发读的主动更新即可解决

        2.如果是菜单、商品介绍等基础数据,可以使用cannal订阅数据库binlog方式进行个性化处理

        3.缓存数据+过期时间可以足够解决大部分业务对缓存的要求。

        4.通过加锁保证并发读写,可以使用读写锁

总结:

        我们能放入缓存的数据就不应该是实时性、一致性要求超高的数据。

        不应该过度设计,增加系统的复杂度。过度设计会增加大量的开发工作以及维护工作。

缓存一致性解决-Canal

更新缓存

        Canal是阿里开源的中间件,可以模拟成数据库的从服务器,直接订阅数据库的binlog日志,然后拿到变化后更新redis 

优点:改数据库就可以了,不用关心任何的缓存操作,数据修改完成自动同步更新。

缺点:增加了中间件,需要额外开发。

解决数据异构问题

        我们去浏览淘宝京东,每个人推荐的商品都是不一样的,基于爱好进行推荐,可以使用Canal进行操作,简单逻辑:

         

 总结

一致性解决方案:        

        1.缓存所有数据都要有过期时间,保证数据过期后的下一次查询触发主动更新缓存。

        2.读写数据的时候,加上分布式的读写锁(读相当于无锁状态)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Golang 小项目(3)
  • 【重学 MySQL】六、MySQL 的下载、安装、配置
  • npm、yarn、pnpm小节
  • css三点闪烁(可用于加载样式、标题等)
  • AWS EC2安全组配置:轻松开放端口访问
  • DataX导入或导出hive数据
  • 小程序使用iconfont字体图标
  • 注册安全分析报告:央视网
  • 【系统架构设计师-2021年】综合知识-答案及详解
  • 蓝桥杯备赛day01:循环
  • UDP广播、 组播通信
  • c++ 156函数
  • 【web安全】SQL注入篇
  • 网安新声 | 智能家居时代,用户隐私谁来守护
  • ACW快凝科技:打造无漏坚固新纪元,环保高效封堵未来
  • CSS魔法堂:Absolute Positioning就这个样
  • css选择器
  • HTML中设置input等文本框为不可操作
  • Invalidate和postInvalidate的区别
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Object.assign方法不能实现深复制
  • orm2 中文文档 3.1 模型属性
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 你不可错过的前端面试题(一)
  • 判断客户端类型,Android,iOS,PC
  • 区块链技术特点之去中心化特性
  • 入口文件开始,分析Vue源码实现
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • !$boo在php中什么意思,php前戏
  • # Java NIO(一)FileChannel
  • #define用法
  • #NOIP 2014# day.1 T2 联合权值
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (六)激光线扫描-三维重建
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (转)负载均衡,回话保持,cookie
  • (转)重识new
  • (转载)从 Java 代码到 Java 堆
  • .net core控制台应用程序初识
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • @html.ActionLink的几种参数格式
  • @Transaction注解失效的几种场景(附有示例代码)
  • [20170705]diff比较执行结果的内容.txt
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [BIZ] - 1.金融交易系统特点