蓝盟IT外包,如果再过度使用高速缓存的话,CTO会发狂!

发布者:上海IT外包来源:http://www.lanmon.net点击数:880

蓝盟IT小贴士,来喽!
1 .为什么数据不一致?
数据库瓶颈是可见的,在高并发环境中容易发生I/O锁定。 的当务之急是将常用数据提取到更高速的存储中。 这种更快的存储可以是分布式存储(如Redis  ),也可以是独立存储(如Caffeine  )。
但是,一旦加入缓存,就必须面对数据一致性这一蛋疼的问题。
数据不一致的问题,世界上变多了。 训练过Java多线程的同学一定还记得JMM的模型。 一个数值只需要同时保存在两个地方,它就会产生问题。
但是,缓存系统和数据库比JMM更不可靠。 分布式组件更脆弱,因此随时都可能出现问题。
2 .缓存辅助模式
如何保证数据在数据库和缓存中的一致性? 现在的最佳做法之一是缓存辅助模式。
我们先来看看数据的读取过程。 规则是,首先读cache,然后读数据库。 详细步骤如下。
每次读取数据时,都从cache读取
读完后,就这样回去,叫cache  hit
无法读取cache的数据时,从数据库中抽取一部分,称为cache  miss
如果将导入的数据装入缓存,则下次导入时可以直接命中
试着写一下请求吧。 规则是更新数据库,然后删除缓存。 详细步骤如下。
将更改写入数据库
删除缓存中的相应数据
说到这里,我看到一些人皱着眉头。 我知道。 一定有人想不通,认为自己的套是对的。 例如,为什么要删除缓存,不是更新缓存吗? 不是效率更低吗? 为什么不在删除缓存之后更新数据库?
哎呀呀,他们向总监提问。
3 .为什么要删除缓存而不是更新缓存?
这个很容易理解。 在多个更新操作同时到来的情况下,删除动作的结果被确定; 更新操作可能会产生不同的结果。
两个请求a和b在请求b为请求a之后数据为最新。 由于缓存的存在,如果在保存时稍有偏差,则a的缓存值会复盖b的值,则在下一次数据更改之前,数据库的记录值和缓存值会出现不一致。
另一方面,在删除方式中,缓存为miss,因此每次从db获取最新的数据并输入,与缓存操作的定时关系不大。
4 .为什么不在更新数据库之前删除缓存?这个问题很相似。 我们不需要同时写作的场景就能发现问题。
上述缓存删除行为和数据库更新行为显然不在一个事务中。 如果一个请求删除了缓存,同时又收到了另一个请求,当发现没有相关的缓存项时,将从数据库中加载一份到缓存系统中。 接着,数据库的更新操作也完成了。 此时,数据库的内容和缓存的内容发生了不一致。

文/上海蓝盟  IT外包专家

IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部