美文网首页源码原理
缓存读写策略 - Cache Aside

缓存读写策略 - Cache Aside

作者: SlowGO | 来源:发表于2019-12-13 08:54 被阅读0次

    场景描述

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

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

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

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

    image

    这样会造成数据不一致。

    image

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

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

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

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

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

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

    image

    同样可能数据不一致。

    image

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

    还是非原子操作的原因。

    Cache Aside 策略

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

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

    • 读策略步骤
    image
    • 写策略步骤
    image

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

    例如这个场景:

    image

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

    • 注意

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

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

    image

    相关文章

      网友评论

        本文标题:缓存读写策略 - Cache Aside

        本文链接:https://www.haomeiwen.com/subject/vynxnctx.html