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

动漫建模代做网站百度一下网站建设验收模板

动漫建模代做网站百度一下,网站建设验收模板,小网站做长尾词还是流量词,网络应用服务管理MySQL与Redis的缓存一致性问题 前言 在学习中,为了提高数据的读取效率,我们往往会使用Redis来作为MySQL数据的缓存,那么,自然就产生了二者间数据的一致性问题。 想要对MySQL和Redis进行数据处理,自然会产生以下问题…

MySQL与Redis的缓存一致性问题

前言

在学习中,为了提高数据的读取效率,我们往往会使用Redis来作为MySQL数据的缓存,那么,自然就产生了二者间数据的一致性问题。

想要对MySQL和Redis进行数据处理,自然会产生以下问题:

  • MySQL与Redis操作的时序问题
    • 更新与删除的选择及时序问题

下面我们来一一分析:

先操作MySQL

先删除MySQL中数据

这种情况下,当我们选择先将MySQL中的数据删除时,如果后续写入新数据失败,新数据就很有可能会丢失,我们就完全失去了这条数据,这是难以接受的。所以我们还是来看看先更新MySQL的情况吧:

先更新MySQL中数据

这种情况下,当客户端修改一个数据时,我们先将MySQL中数据更新为最新状态,然后再操作Redis(如果第一步更新MySQL数据失败,就不会继续操作Redis了,此时MySQL和Redis中的数据都还是老数据,也是处于一致状态,可以接受):

再更新Redis中数据

试想这样一种情况:

线程A和线程B按以下顺序执行:

  1. 线程A缓存未命中,然后从MySQL中读到数据c=1
  2. 线程B想将数据c=1修改为c=2
  3. 线程B先更新MySQL成功,再更新Redis数据c=2(不论更新Redis成功与否)
  4. 线程A写回Redis数据c=1

可以看到,此时MySQL中是新数据c=2,Redis中却是老数据c=1,处于不一致状态。在Redis中该数据自动过期,或者再次更新该数据之前,客户端都会读到Redis中的老数据(脏数据)。

不过读操作,往往比写操作更快速,也就是说大多数情况下,线程A等线程B操作完了再写回Redis的情况不会出现。

但是,对于并发更新的情况,可能会出现多个线程并发更新Redis数据,导致老数据覆盖新数据的情况,也会造成不一致状态。

再删除Redis中数据

与上面“再更新Redis中数据”的情况类似,可能会出现线程B删除完Redis数据后,线程A又写回老数据的情况。

但是,对于并发更新的情况,就算多个线程并发删除Redis数据,也能够保证删除老数据,不会造成不一致状态。

当然,如果删除Redis失败了,Redis中还是会留下老数据,造成不一致状态。

先操作Redis

先删除Redis中数据

再更新MySQL中数据

试想这样一种情况:

线程A和线程B按以下顺序执行:

  1. 线程B想将数据c=1修改为c=2
  2. 线程B先删除Redis中数据成功
  3. 线程A缓存未命中,然后从MySQL中读到数据c=1
  4. 线程B更新MySQL中数据c=2
  5. 线程A写回Redis数据c=1

可以看到,此时MySQL中是新数据c=2,Redis中却是老数据c=1,处于不一致状态。在Redis中该数据自动过期,或者再次更新该数据之前,客户端都会读到Redis中的老数据(脏数据)。

此外,对于并发更新的情况,可能会出现多个线程并发更新MySQL数据,导致老数据覆盖新数据的情况,也会造成不一致状态。

再删除MySQL中数据

这种情况下,当我们选择将MySQL中的数据删除时,如果后续Redis中的新数据丢失(磁盘存储相对内存存储的可靠性更高),我们就完全失去了这条数据,这是难以接受的。

总结

Cache-Aside (旁路缓存)

综上所述,我们往往会选择 先更新MySQL中数据-再删除Redis中数据 的方案。

以上所述所有的方案,有一个统称:Cache-Aside (旁路缓存)

直读 与 同步/异步直写

此外,如果我们将缓存的业务直接从其它业务代码中抽取出来,给其它业务提供一个缓存抽象层,将缓存的操作全部放在这个缓存抽象层中独立存在,也就是缓存的解耦。

这样,主体业务就只需要与抽出来的缓存层进行交互,无需再关心数据的一致性,直接读/写缓存层,也就是直读直写

直读(Write-Through)

客户端(也可以是其他业务层)直接读取Redis缓存,如果缓存未命中,从MySQL中读取数据后,再写回Redis,然后再返回给客户端。

直写(Write-Through)

客户端(也可以是其他业务层)直接先更新Redis缓存,然后再更新MySQL,然后再返回数据给客户端。

上面的是同步直写,如果在更新MySQL的同时,异步将数据返回给客户端,那么就叫异步直写(Write-Behind)

canal

此外,为了提高系统的可用性,我们可以配合一些成熟的中间件,例如:

使用Canal监控MySQL的binlog日志,自动通知缓存业务MySQL中的数据进行了什么修改,可以让我们的系统迅速知道MySQL的数据改动,延迟极低。

在缓存业务中,我们往往还可以引入消息队列,提高数据传输的可靠性,例如:

当Canal监控到MysQL数据改动后,将监控数据发送到RabbitMQ,由订阅了相关Topic的缓存业务消费监控数据并进行处理,可以有效避免数据传输中失败、丢失等问题。

http://www.dtcms.com/wzjs/792728.html

相关文章:

  • 网站空间续费后网页不能打开wordpress 仿钛媒体
  • 什么网站后台程序好用男女做视频观看网站
  • 网站关键词上首页综合网站推广
  • 个人介绍网页模板免费下载海南网站优化公司
  • 凡科建站收费价目表北京网络营销推广外包
  • 电信的网做的网站移动网打不开该找电信还是移动wordpress范例
  • 天津网站建设制作方案网站建设与开发的收获与体会
  • 网站制作类型白云鄂博矿网站建设
  • icp备案网站接入信息怎么填平面设计必学软件
  • 商城网站开发 多少钱纯flash网站下载
  • 平面设计相关的网站有哪些宁波网站建设的公司
  • html5 网站开发实战frontpage导入网站
  • 快速建站哪里好网站建设 创意视频
  • 网站 icp备案制作一个app需要什么技术
  • 网站建设下坡路个人网站能不能做论坛
  • 科技信息网站系统建设方案二级域名是什么意思
  • 邢台高端网站建设公司开源网站建设实习心得
  • 电子商城网站源码做网站哈尔滨
  • 四川省住房和城乡建设网站企业网站的建设对于网络品牌的塑造作用
  • 怎么做网站宣传建设视频网站设计意义
  • 蓝图网站建设免费做公众号的网站
  • 做网站建站点建立网站容量
  • 网站域名包括哪些oa系统的概念
  • 网站里的动态是如何制作框架网站模板
  • 网站建设提供排名建设音乐主题网站
  • 做企业网站10万起步敬请期待图片素材
  • google网站地图格式地方门户网站建设多少钱
  • 网站建设所需人力时间为什么不用h5做网站
  • 北京网站建设的公wordpress区别
  • 网站开发流程知乎点击最多的网站