缓存和数据库一致性问题,有很多解决方案,没有最完美的方案,只有适合自身业务的尽可能完美的方案。

缓存由于其高并发和高性能的特征,已经在项目中被广泛应用。

查询时一般先查询缓存,如果缓存命中的话,那么直接将数据返回。

如果缓存中没有数据(如失效,或者根本没设置数据),那么,应用程序先从数据库中查询数据,如果不为空,则将数据放在缓存中。

那么更新时,怎么处理缓存和数据库呢?先更新数据库后更新缓存?先更新数据库后更新缓存?或者先淘汰缓存后更新数据库?

为什么没有先更新缓存后更新数据库?

1):如果更新数据库失败,那么就造成了数据不一致

先更新数据库后更新缓存的问题:

1):两个线程并发更新数据库再更新缓存可能出现缓存更新顺序问题

2):如果更新频繁,读少的情况,那么缓存也被频繁更新,造成不必要的开销

3):如果缓存的值是需要经过一系列复杂计算的,那么每次都去更新缓存无疑是浪费性能的

先删缓存后更新数据库的问题:

1):线程A删除缓存更新完数据库前,线程B没有命中缓存,从数据库中查询到了更新前的值存入缓存中

解决方案:延时双删策略(推荐使用)

即先删除缓存,再更新数据库,休眠一段时间,再删除缓存

伪代码如下:

public voidwrite(String key,Object data){

redis.delKey(key);

db.updateData(data);

Thread.sleep(1000); redis.delKey(key);

}

为什要休眠1秒钟?为了将这1秒内造成的脏数据删除,可能有线程读取到了更新前的旧数据还未来得及写入缓存

休眠的时间多少如何确定?评估自身项目读数据业务逻辑的耗时,在这基础了加100ms即可。可以确保脏数据已经写入缓存中

读写分离怎么办?

也是采用延时双删策略,休眠时间确保完成主从同步

为了避免休眠造成吞吐量降低,可以将第二次删除作为异步操作

第二次删除失败怎么办?

删除在更新期间写入缓存的旧值失败

解决方案:将需要删除的key发送到消息队列,然后自己消费消息,获得需要删除的key,继续重试删除操作,直到成功。

先更新数据库后删缓存

即Cache Aside Pattern,即缓存旁路模式

失效:应用程序先从缓存中取数据,没有取到,则从数据库中取数据,成功后,放到缓存中

命中:应用程序从缓存中渠道数据,然后返回

更新:先把数据存到数据库中,成功后,再删除缓存

分布式mysql一致性问题_分布式缓存数据库一致性问题相关推荐

  1. mysql 多线程 一致性_常见缓存数据库一致性方案(建议收藏)

    项目中常常会用到redis 作为缓存抵挡大量流量直接冲击数据库mysql,那么必然涉及缓存和数据库数据的一致性(尽量短时间内最终一致性)问题. 导致不一致的原因主要有三种情况: 1:并发下,读取旧数据 ...

  2. 分布式mysql保持数据一致性_一种分布式跨数据库保持事务一致性的方法及系统与流程...

    本发明涉及计算机网络技术领域,尤其涉及一种分布式跨数据库保持事务一致性的方法及系统. 背景技术: 目前,分布式服务架构十分的流行,特别是对于电商领域来说.他的优点就不多说了,但是随着集群机器的增加,集 ...

  3. mysql分布式事务wcf_WCF系列_分布式事务(下)

    1.WCF分布式事务例子 这里也用转账的例子说事. 用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B的相应账户的资金就增加多少. 系统A机器上有数据库AccountA, ...

  4. mysql分布式如何实现原理_分布式通讯协议实现原理

    分为两个阶段:投票表决阶段和提交阶段. 事务参与者完成系统相关业务成功后,通知协调者状态,当所有的事务参与者业务状态都成功后, 协调者才发出提交指令,参与者提交或者取消事务 一协调者 二事务的参与者( ...

  5. mysql查询耗时_一种数据库高耗时查询的自动取消方法与流程

    本发明涉及数据库的查询方法,特别涉及一种数据库高耗时查询的自动取消方法. 背景技术: 有很多关系型数据库查询业务非常耗时,比如查询企业实时报表之类的,一次查询可能需要几分钟甚至更长.在很多时候,前端业 ...

  6. 阿里云mysql端口管理_怎样更改数据库端口号

    如何避免数据库"勒索事件"和"从删库到跑路"的尴尬 摘要:8月24日,阿里云数据库技术峰会到来,本次技术峰会邀请到了阿里集团和阿里云数据库老司机们,为大家分享了 ...

  7. mysql 增量备份_云计算-开源数据库-备份

    关于备份: 备份原因:怕丢,怕被误删. 备份目标:数据的一致性,服务的可用性. 备份技术:物理备份/冷备份 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版 ...

  8. mysql 冗余字段_如何合理使用数据库冗余字段的方法

    privot多对多关系的中间表.PT5框架会自动把privot带上. 我们需要隐藏,因为我们不需要privot,而且pritvot也不在我们模型本身,他是中间数据 另外冗余字段,我们有一个表是记录图片 ...

  9. bt面板mysql经常停止_宝塔面板数据库经常自动停止解决办法,自动重启shell脚本...

    宝塔的数据库经常性自动停止,是因为网站频繁的请求数据库,而服务器内存又不足,为了保证服务器不彻底卡死,保护性的自动停止数据库,特别是有些程序比如wordpress的数据库查询次数尤为突出,wordpr ...

最新文章

  1. start ssh-agent
  2. 【thymeleaf 】在 thymeleaf 中使用 shiro 标签
  3. 记录 之 numpy查看数据类型和类型转换
  4. enterprise search for Object is not enabled
  5. win7-安装phantomjs,并添加环境变量。
  6. 毕业之后......
  7. 大学计算机基础书本里的毕业论文源稿,计算机基础毕业论文范文
  8. ELF格式解析库之基本数据类型
  9. 未来计算机的两个发展方向是巨型化和,【填空题】未来的计算机将以超大规模集成电路为基础,向巨型化、( )、多媒体化、网络化和智能化的方向发展。...
  10. Android源码设计模式解析与实战(四)
  11. html日历框架,日历.html
  12. 24. yii2 表单赋值 model-load(), model-attributes 方法
  13. Flask组件之Flask-SQLAlchemy
  14. 御剑飞行扫描后门加上burpsuite字典树爆破
  15. 中国移动微处理器CM32M101A介绍
  16. SEO前端篇(二)关键词
  17. 社交网络分析-中心性指标
  18. 硬件算法与软件算法实现区别通俗易懂
  19. ESP32笔记(2) flash使用
  20. 20200518 如何快速画出闭环特征方程的根轨迹

热门文章

  1. python3虚拟环境搭建_python3 =虚拟环境的搭建
  2. python守护进程windows_如何把 python predict程序 做成 windows 守护进程
  3. ppp chap 加密摘要_“网络工程师培训”基础教程:一文读懂PPP协议
  4. 批量处理文件,除了 Python,不妨试试 VIM!
  5. 就是现在!2020 求职加薪手册,人手一份!
  6. 520 页机器学习笔记!图文并茂可能更适合你
  7. 开放下载!复旦大学邱锡鹏教授发布教科书《神经网络与深度学习》
  8. 江苏机器人竞赛南航_中国青少年机器人竞赛
  9. mfc cstring 写入文件_兄弟Brother单色激光传真一体机MFC系列不能写入此文件夹提示解决方案...
  10. 05字符串的常用基本操作