码迷,mamicode.com
首页 > 系统相关 > 详细

缓存读写策略 - Cache Aside.md

时间:2019-12-13 09:34:02      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:http   sp2   图片   数据一致性   wds   不一致   作用   方式   没有   

场景描述

比如一条数据同时存在数据库、缓存,现在你要更新此数据,你会怎么更新?

先更新数据库?还是先更新缓存?

其实这两种方式都有问题。

(1)先更新数据库,后更新缓存

技术图片

这样会造成数据不一致。

技术图片

A 先把数据库更新为 123,由于网络问题,更新缓存的动作慢了。

这时,B 去更新数据库了,改为了 456,紧接着把缓存也更新为 456。

现在 A 更新缓存的请求到了,把缓存更新为了 123。

那么这时数据就不一致了,数据库里是最新的 456,而缓存是 123,是旧数据。

因为数据库更新、缓存更新这2个动作不是原子的,在高并发操作时,这2个动作直接会插入其他动作。

(2)先更新缓存,再更新数据库

技术图片

同样可能数据不一致。

技术图片

缓存更新成功,数据为最新的,但数据库更新失败,回滚了,还是旧数据。

还是非原子操作的原因。

Cache Aside 策略

其实,在更新数据时,我们可以不更新缓存,而是删除缓存中的数据,在读取数据时,发现缓存中没有,再从数据库中读取数据,更新到缓存中。

这就是 Cache Aside 策略(旁路缓存策略)

  • 读策略步骤

技术图片

  • 写策略步骤

技术图片

写时可以不可以先删除缓存?不行!

例如这个场景:

技术图片

A 先删了缓存,还没等数据库更新完成呢,就被 B 把缓存更新为了旧值。

  • 注意

Cache Aside 策略也是不保证数据一致性的,它的作用是大大减少不一致性。

某些极端情况还是存在不一致,如果业务上不允许,可以考虑加分布式锁。

技术图片

缓存读写策略 - Cache Aside.md

标签:http   sp2   图片   数据一致性   wds   不一致   作用   方式   没有   

原文地址:https://www.cnblogs.com/yogoup/p/12033159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!