zoukankan      html  css  js  c++  java
  • 数据库|缓存一致性总结

    数据库主从不一致解决方案:

    方案一:忽略--如果业务能够接受,别把系统架构搞得太复杂

    方案二:强制读主--使用一个高可用主库提供数据库服务--过于粗暴

    方案三:选择性读主--写主库时将哪个库,哪个表,哪个主键三个信息拼装一个key设置到cache里,这条记录的超时时间,设置为“主从同步时延(比如1s)”,然后读的时候先判断cache有没有,有则读主库,否则读从库

    ref:数据库主从不一致,怎么解?

    数据库|缓存一致性解决方案:

    Cache Aside Pattern:

    查询:cache-》如果没有则查询数据库 -》放回cache

    更新:更新数据库-》删除缓存
    (其实删除缓存,而不是更新缓存,就是一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。像 mybatis,hibernate,都有懒加载思想)

    1.防止读写并发导致数据库和缓存不一致的情况(线程1更新db为x-》线程2更新db为y-》线程2更新缓存为y-线程1更新缓存为y===》db和缓存不一致)

    2.在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。

    PS:特殊情况下:读写并发则不可行(线程1读缓存(miss)=》线程1读数据库=>线程2写数据库=》线程2使缓存失效=》线程1放入老数据库的数据) 不过概率极低,写db比读要慢

    但如果删除缓存失败就会导致数据库和缓存不一致了==>(http://www.jintiankansha.me/t/jmm4fB2a8S)
    (http://www.jintiankansha.me/t/0bKZVSdist)

    • 延时双删(删缓存|删数据库|睡眠|再删)
    • 订阅mysql binlog更新缓存数据
    • 更新请求放入JVM队列排序 读请求循环判断是否已经更新
    =====原文作者博客园----dustyhope,转载请注明出处,谢谢
  • 相关阅读:
    mysql 常用命令
    mysql 存储过程知识点
    position 属性值:relative 与 absolute 区别
    spring 注解列表
    spring aop 术语
    socket、WebSocket
    spring mvc 基础
    requestAnimationFrame 提高动画性能的原因
    markdown 知识点
    SpringMVC Controller 介绍及常用注解
  • 原文地址:https://www.cnblogs.com/liwanping/p/11161872.html
Copyright © 2011-2022 走看看