缓存读写策略 - Cache Aside.md

Posted yogoup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存读写策略 - Cache Aside.md相关的知识,希望对你有一定的参考价值。

场景描述

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

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

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

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

技术图片

这样会造成数据不一致。

技术图片

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

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

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

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

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

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

技术图片

同样可能数据不一致。

技术图片

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

还是非原子操作的原因。

Cache Aside 策略

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

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

  • 读策略步骤

技术图片

  • 写策略步骤

技术图片

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

例如这个场景:

技术图片

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

  • 注意

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

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

技术图片

以上是关于缓存读写策略 - Cache Aside.md的主要内容,如果未能解决你的问题,请参考以下文章

缓存读写策略 - Cache Aside

google cache源码详解

Linux读写缓存Page Cache

Linux读写缓存Page Cache

高并发系统:缓存使用-读写策略

Web缓存控制策略详解