zoukankan      html  css  js  c++  java
  • 数据库和缓存一致性解决方案

    缓存延时双删

    问:先删除缓存,再更新数据库中避免脏数据?

    答案:采用延时双删策略。

    上文我们提到,在先删除缓存,再更新数据库的情况下,如果不采用给缓存设置过期时间策略,该数据永远都是脏数据。

    那么延时双删怎么解决这个问题呢?

    (1)先淘汰缓存

    (2)再写数据库(这两步和原来一样)

    (3)休眠1秒,再次淘汰缓存

    这么做,可以将1秒内所造成的缓存脏数据,再次删除。

    那么,这个1秒怎么确定的,具体该休眠多久呢?

      针对上面的情形,读者应该自行评估自己的项目的读数据业务逻辑的耗时。然后写数据的休眠时间则在读数据业务逻辑的耗时基础上,加几百ms即可。这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。

      

    如果你用了mysql的读写分离架构怎么办?

    ok,在这种情况下,造成数据不一致的原因如下,还是两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。

    (1)请求A进行写操作,删除缓存

    (2)请求A将数据写入数据库了,

    (3)请求B查询缓存发现,缓存没有值

    (4)请求B去从库查询,这时,还没有完成主从同步,因此查询到的是旧值

    (5)请求B将旧值写入缓存

    (6)数据库完成主从同步,从库变为新值

    上述情形,就是数据不一致的原因。还是使用双删延时策略。只是,睡眠时间修改为在主从同步的延时时间基础上,加几百ms。

    采用这种同步淘汰策略,吞吐量降低怎么办?

    ok,那就将第二次删除作为异步的。自己起一个线程,异步删除。这样,写的请求就不用沉睡一段时间后了,再返回。这么做,加大吞吐量。

  • 相关阅读:
    iptables 端口转发规则
    iptables 设置端口转发/映射
    iptables 从一台机到另一台机端口转发
    iptables nat 技术转发
    统计将⽂文件内容读出,然后统计读出的字符串串中每个字符的个数
    day03-课堂笔记-大纲
    day03-课堂笔记
    转载:linux同步时间信息
    获取列表的索引操作:enumerate
    oldboy-作业01.登录多次进行账号锁定
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14340246.html
Copyright © 2011-2022 走看看