高并发下的缓存一致性问题

数据读取的时候:

先查缓存,缓存查不到查数据库,然后把查到的结果放到缓存中。这些都基本上没有争议。

但是数据更新的时候:

到底是先更新数据库,还是再更新(or删除)缓存

or 先更新(or删除)缓存,再更新数据库。

一直存在很大的争议。几种实现方式都会出现数据一致性问题。

我就说说目前我们系统是怎么做的:

0、先确认缓存命中率。不要动不动就上缓存,有些缓存命中率根本毫无意义,比如涉及到和账户相关的资产、订单等信息,就算放入缓存中,只有用户自己会去查自己的信息,命中率极低。

一般是把与账户无关,且查询量较大的放入缓存中。

1、缓存设置过期时间,保证最终一致性。

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

可能会出现更新数据库后,删除缓存失败,导致缓存是旧数据,数据库是新数据,出现不一致性。

但是这种概率非常低。

而且删除缓存失败后,我们也可以做一些处理。

为什么是删除缓存,而不是更新缓存。

因为缓存不一定直接是数据库中的内容,有可能是多个字段计算出来的,如果每次更新都去写缓存,会导致性能消耗。

为什么不是先删除缓存,再更新数据库。

因为先删除缓存,如果在更新操作还没commit的时候,另外一个线程进来读取数据,缓存查不到,查数据库并放入缓存。然后第一个更新操作commit了。

导致缓存是旧数据,而数据库是新数据。且不会像前面提到的删除缓存失败那样方便做处理。

如果业务要求强一致性,则尽可能不用缓存。

原文地址:https://www.cnblogs.com/jylsgup/p/10311197.html

时间: 2024-07-30 20:06:59

高并发下的缓存一致性问题的相关文章

聊聊高并发(五)理解缓存一致性协议以及对并发编程的影响

Java作为一个跨平台的语言,它的实现要面对不同的底层硬件系统,设计一个中间层模型来屏蔽底层的硬件差异,给上层的开发者一个一致的使用接口.Java内存模型就是这样一个中间层的模型,它为程序员屏蔽了底层的硬件实现细节,支持大部分的主流硬件平台.要理解Java内存模型以及一些处理高并发的技术手段,理解一些基本的硬件知识是必须的.这篇会说一下跟并发编程相关的一些硬件知识. 一个基本的CPU执行计算的过程如下: 1. 程序以及数据被加载到主内存 2. 指令和数据被加载到CPU的高速缓存 3. CPU执行

高并发下问题随笔

高并发下随笔 随便写写,有什么不对的地方,请多指教. 选NGINX还是APACHE抗并发: 首先常用的架构是LNMP,之前用过LAMP的架构,但发现APACHE在高并发下表现并没有NGINX优异,原因是NGINX是异步非阻塞,APACHE是同步多进程阻塞型,NGINX会占用更少的资源抗并发,可能几千上万个链接依旧使用一个链接,NGINX也很容易组成集群, 给不同配置的服务器分配不同的权重,还包括负载均衡的方式,比如轮询与我们常用的IP_HASH等,所以推荐LNMP的架构. 选择HDD还是SSD硬

php结合redis实现高并发下的抢购、秒杀功能

原文: http://blog.csdn.net/nuli888/article/details/51865401 抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis.重点在于第二个问题 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问

缓存一致性和跨服务器查询的数据异构解决方案canal

当你的项目数据量上去了之后,通常会遇到两种情况,第一种情况应是最大可能的使用cache来对抗上层的高并发,第二种情况同样也是需要使用分库 分表对抗上层的高并发...逼逼逼起来容易,做起来并不那么乐观,由此引入的问题,不见得你有好的解决方案,下面就具体分享下. 一:尽可能的使用Cache 比如在我们的千人千面系统中,会针对商品,订单等维度为某一个商家店铺自动化建立大约400个数据模型,然后买家在淘宝下订单之后,淘宝会将订单推 送过来,订单会在400个模型中兜一圈,从而推送更贴切符合该买家行为习惯的

高并发下的 Nginx 优化与负载均衡

高并发下的 Nginx 优化 英文原文:Optimizing Nginx for High Traffic Loads 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. 有一些坏消息要告诉你, 你不能像Apache一样优化Nginx.它没有魔术配置来减半负载或是让PHP运行速度加快一倍. 高兴的是, Nginx已经优化的非常好了. 当你决定使用Nginx并用a

高并发下的Nginx优化

高并发下的Nginx优化 2014-08-08 13:30 mood Nginx 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. AD:2014WOT全球软件技术峰会北京站 课程视频发布 11月21日-22日 与WOT技术大会相约深圳 现在抢票 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache

数据异构解决方案缓存一致性和跨服务器查询

缓存一致性和跨服务器查询的数据异构解决方案canal 当你的项目数据量上去了之后,通常会遇到两种情况,第一种情况应是最大可能的使用cache来对抗上层的高并发,第二种情况同样也是需要使用分库 分表对抗上层的高并发...逼逼逼起来容易,做起来并不那么乐观,由此引入的问题,不见得你有好的解决方案,下面就具体分享下. 一:尽可能的使用Cache 比如在我们的千人千面系统中,会针对商品,订单等维度为某一个商家店铺自动化建立大约400个数据模型,然后买家在淘宝下订单之后,淘宝会将订单推 送过来,订单会在4

php 结合redis实现高并发下的抢购、秒杀功能

抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis.重点在于第二个问题 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问题,导致库存量出现负数 [php] view plain copy <?php $conn=mysql_con

(高级篇)php结合redis实现高并发下的抢购、秒杀功能

抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis.重点在于第二个问题 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问题,导致库存量出现负数 优化方案1:将库存字段number字段设为unsigned,当库存为0时,因为字段不能为负数