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

推荐好的网站或网页网站制作排名

推荐好的网站或网页,网站制作排名,好看的电商网站模板下载,直接网址登录wordpress数据不一致问题是操作数据库和操作缓存值的过程中,其中一个操作失败的情况。实际上,即使这两个操作第一次执行时都没有失败,当有大量并发请求时,应用还是有可能读到不一致的数据。 如何更新缓存 更新缓存的步骤就两步&#xff0…

数据不一致问题是操作数据库和操作缓存值的过程中,其中一个操作失败的情况。实际上,即使这两个操作第一次执行时都没有失败,当有大量并发请求时,应用还是有可能读到不一致的数据。

如何更新缓存

更新缓存的步骤就两步,更新缓存和更新数据库。但是这两步会引申多种情况。

  1. 先更新数据库还是先更新缓存?更新缓存时先删除还是直接更新?
  2. 假设第一步成功了,第二步失败了怎么办?
  3. 假设 2 个线程同时更新同一个数据,A 线程先完成第一步,B 线程先完成第二步,此时该怎么办?
先更新缓存,再更新数据库

对于这个组合可能会出现一下两种情况:

  1. 假设第 2 步数据库更新失败了,要求回滚缓存的更新,这时该怎么办呢?我们知道 Redis 不支持事务回滚,除非我们采用手工回滚的方式,先保存原有数据,然后再将缓存更新回原来的数据,这种解决方案不考虑。
  2. 线程A先将缓存的数据更新为 1,然后在更新数据库前,线程B将缓存的数据更新为 2,由于网络等原因,线程B先一步把数据库更新为 2,然后线程A将数据库的数据更新为 1,此时,就出现了缓存和数据库中数据不一致的现象,如下图所示。

先删除缓存,再更新数据库

使用这种组合,即使数据库更新失败了也不需要回滚缓存。这种组合会出现两种问题。

假设某个商品数量是10个,线程A要更新商品的数量为20,所以它会删除缓存中的内容。这时,另一个线程 B 要读取这个商品的数量,它查询缓存发现未命中后,会从数据库中读取到商品数量为10,并且写入到缓存中,然后线程 A 继续更改数据库,将商品的数量更新为20。

为了解决一致性问题,可以让线程A给Key加锁,这种处理方法可能会使大量的读请求卡在锁中。

先更新数据库,再更新缓存
  1. 数据库更新成功,更新缓存失败怎么办?

数据库更新成功后,不会因为缓存是否成功而回滚。此时一般会采取重试机制来补偿,但是重试机制如果存在延时还是会出现数据不一致的问题,不好处理。

  1. 两个线程同时更新同一个数据,线程A先完成第一步,线程B先完成了第二步怎么办?

线程A 先将数据库的数据更新为 1,然后在更新缓存前,线程B 将数据库的数据更新为 2,然后把缓存更新为 2,然后 线程A更新缓存为 1。
此时,数据库中的数据是 2,而缓存中的数据却是 1,缓存和数据库中的数据不一致。

先更新数据库,再删除缓存

假如某个商品数据在缓存中不存在,线程 A 读取数据时从数据库中查询到商品数量为10,在未写入缓存中时另一个线程 B 更新数据。它更新数据库中的商品数量为20,并且清空缓存。这时线程 A 把从数据库中读到的商品数量10 的数据写入到缓存中。

最终,该商品数量在缓存中是 10(旧值),在数据库中是 20(新值),缓存和数据库数据不一致。

从理论上分析,先更新数据库,再删除缓存也是会出现数据不一致性的问题,但是在实际中,这个问题出现的概率并不高。

因为缓存的写入通常要远远快于数据库的写入,所以在实际中很难出现线程 B 已经更新了数据库并且删除了缓存,线程 A 才更新完缓存的情况。

而一旦线程 A 早于线程 B 删除缓存之前更新了缓存,那么接下来的请求就会因为缓存不命中而从数据库中重新读取数据,所以不会出现这种不一致的情况。

所以,「先更新数据库 + 再删除缓存」的方案,是可以保证数据一致性的。

先删除缓存,更新数据库,再删除缓存

在先删除缓存,更新数据库后,线程A更新完数据库值以后,让他睡眠一小段时间,再进行一次缓存删除操作。

加上睡眠时间,是为了让线程B能够先从数据库读取数据,再把缺失的数据写入缓存,然后,线程A再进行删除。线程A 睡眠的时间,就需要大于线程B读取数据再写入缓存的时间。这个时间是不好确定的,需要根据业务来估算。

其它线程读取数据时,会发现缓存缺失,所以会从数据库中读取最新值。因为这个方案会在第一次删除缓存值后,延迟一段时间再次进行删除,所以我们也把它叫做“延迟双删”。

没有一个组合是完美的,它们都有可能读到旧数据的可能,只不过概率不同,我建议更新缓存时,先更新数据库再删除缓存。

任何一种方案都不是完美的,但如果为了解决极小出现的概率要花好几倍的代价去解决(比如订阅 binlog 日志),从技术上来讲是得不偿失的,所以需要同业务方去协调一个适用的方法。

http://www.yayakq.cn/news/865847/

相关文章:

  • 谷歌优化排名公司企业网站搜索优化网络推广
  • 建站推广免费公司删除windows wordpress
  • 江西网站制作网站logo的颜色与网页的颜色
  • 云南省建设工程招标投标行业协会网站建网站引流做淘宝
  • 做网站运营有提成吗佛山制作网站公司吗
  • 不同类型网站比较wordpress 模拟登陆
  • 甘德县公司网站建设怎样制作做实景的网站
  • 东莞网站建设哪里找做网站赚什么钱
  • 北京网站建设1000zhu怎么做彩票平台网站吗
  • 北京哪有建网站公司或个人的手机百度搜索引擎入口
  • 杭州网站建设开发有限公司美橙建站五合一建站套餐申请
  • 用html5做商城网站怎么做计算机专业设计一个网站
  • 手机网站页面尺寸大小小程序模板下载了怎么用
  • 沈阳网站建设求职简历江西建设厅网站官网
  • 免费素材网站哪个最好永泰建设工程网站
  • 域名抢注网站是怎么免费室内装修3d设计软件
  • 游戏公司网站模板下载wordpress linux版本
  • 可以做线路板网站的背景图app界面怎么做
  • 做跨境网站注意事项东圃做网站
  • 给新公司建网站一元购网站建设方案书
  • 3733手游网站在哪里做的想建一个网站怎么做
  • 开福区网站建设论坛注册域名有什么意义
  • 网站建设中 windows亚马逊中国网站建设目标
  • 有建设网站的软件吗公司注册资金一览表
  • 网站建设采取招标的形式网站地图创建
  • 做填写信息的超链接用什么网站是否有可能一个人完成网站开发
  • 石家庄网站优化排名推广app调用网站
  • 营销型网站开发流程包括logo设计的最好的公司
  • 微商城建设购物网站上海3d网站建设
  • 网站做指向是什么意思wordpress 删除小工具