zoukankan      html  css  js  c++  java
  • 缓存读写策略

    场景描述

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

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

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

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

    这样会造成数据不一致。

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

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

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

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

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

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

    同样可能数据不一致。

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

    还是非原子操作的原因。

    Cache Aside 策略

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

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

    • 读策略步骤

    • 写策略步骤

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

    例如这个场景:

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

    • 注意

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

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

  • 相关阅读:
    1017 A除以B (20分)**
    剑指 Offer 11. 旋转数组的最小数字(简单)
    剑指 Offer 04. 二维数组中的查找(中等)
    剑指 Offer 53
    剑指 Offer 53
    剑指 Offer 03. 数组中重复的数字(简单)
    剑指 Offer 58
    剑指 Offer 05. 替换空格(简单)
    执行npm install命令出错问题
    剑指 Offer 35. 复杂链表的复制(中等)
  • 原文地址:https://www.cnblogs.com/yogoup/p/12033159.html
Copyright © 2011-2022 走看看