分布式mysql一致性问题_分布式缓存数据库一致性问题
缓存和数据库一致性问题,有很多解决方案,没有最完美的方案,只有适合自身业务的尽可能完美的方案。
缓存由于其高并发和高性能的特征,已经在项目中被广泛应用。
查询时一般先查询缓存,如果缓存命中的话,那么直接将数据返回。
如果缓存中没有数据(如失效,或者根本没设置数据),那么,应用程序先从数据库中查询数据,如果不为空,则将数据放在缓存中。
那么更新时,怎么处理缓存和数据库呢?先更新数据库后更新缓存?先更新数据库后更新缓存?或者先淘汰缓存后更新数据库?
为什么没有先更新缓存后更新数据库?
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一致性问题_分布式缓存数据库一致性问题相关推荐
- mysql 多线程 一致性_常见缓存数据库一致性方案(建议收藏)
项目中常常会用到redis 作为缓存抵挡大量流量直接冲击数据库mysql,那么必然涉及缓存和数据库数据的一致性(尽量短时间内最终一致性)问题. 导致不一致的原因主要有三种情况: 1:并发下,读取旧数据 ...
- 分布式mysql保持数据一致性_一种分布式跨数据库保持事务一致性的方法及系统与流程...
本发明涉及计算机网络技术领域,尤其涉及一种分布式跨数据库保持事务一致性的方法及系统. 背景技术: 目前,分布式服务架构十分的流行,特别是对于电商领域来说.他的优点就不多说了,但是随着集群机器的增加,集 ...
- mysql分布式事务wcf_WCF系列_分布式事务(下)
1.WCF分布式事务例子 这里也用转账的例子说事. 用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B的相应账户的资金就增加多少. 系统A机器上有数据库AccountA, ...
- mysql分布式如何实现原理_分布式通讯协议实现原理
分为两个阶段:投票表决阶段和提交阶段. 事务参与者完成系统相关业务成功后,通知协调者状态,当所有的事务参与者业务状态都成功后, 协调者才发出提交指令,参与者提交或者取消事务 一协调者 二事务的参与者( ...
- mysql查询耗时_一种数据库高耗时查询的自动取消方法与流程
本发明涉及数据库的查询方法,特别涉及一种数据库高耗时查询的自动取消方法. 背景技术: 有很多关系型数据库查询业务非常耗时,比如查询企业实时报表之类的,一次查询可能需要几分钟甚至更长.在很多时候,前端业 ...
- 阿里云mysql端口管理_怎样更改数据库端口号
如何避免数据库"勒索事件"和"从删库到跑路"的尴尬 摘要:8月24日,阿里云数据库技术峰会到来,本次技术峰会邀请到了阿里集团和阿里云数据库老司机们,为大家分享了 ...
- mysql 增量备份_云计算-开源数据库-备份
关于备份: 备份原因:怕丢,怕被误删. 备份目标:数据的一致性,服务的可用性. 备份技术:物理备份/冷备份 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版 ...
- mysql 冗余字段_如何合理使用数据库冗余字段的方法
privot多对多关系的中间表.PT5框架会自动把privot带上. 我们需要隐藏,因为我们不需要privot,而且pritvot也不在我们模型本身,他是中间数据 另外冗余字段,我们有一个表是记录图片 ...
- bt面板mysql经常停止_宝塔面板数据库经常自动停止解决办法,自动重启shell脚本...
宝塔的数据库经常性自动停止,是因为网站频繁的请求数据库,而服务器内存又不足,为了保证服务器不彻底卡死,保护性的自动停止数据库,特别是有些程序比如wordpress的数据库查询次数尤为突出,wordpr ...
最新文章
- start ssh-agent
- 【thymeleaf 】在 thymeleaf 中使用 shiro 标签
- 记录 之 numpy查看数据类型和类型转换
- enterprise search for Object is not enabled
- win7-安装phantomjs,并添加环境变量。
- 毕业之后......
- 大学计算机基础书本里的毕业论文源稿,计算机基础毕业论文范文
- ELF格式解析库之基本数据类型
- 未来计算机的两个发展方向是巨型化和,【填空题】未来的计算机将以超大规模集成电路为基础,向巨型化、( )、多媒体化、网络化和智能化的方向发展。...
- Android源码设计模式解析与实战(四)
- html日历框架,日历.html
- 24. yii2 表单赋值 model-load(), model-attributes 方法
- Flask组件之Flask-SQLAlchemy
- 御剑飞行扫描后门加上burpsuite字典树爆破
- 中国移动微处理器CM32M101A介绍
- SEO前端篇(二)关键词
- 社交网络分析-中心性指标
- 硬件算法与软件算法实现区别通俗易懂
- ESP32笔记(2) flash使用
- 20200518 如何快速画出闭环特征方程的根轨迹
热门文章
- python3虚拟环境搭建_python3 =虚拟环境的搭建
- python守护进程windows_如何把 python predict程序 做成 windows 守护进程
- ppp chap 加密摘要_“网络工程师培训”基础教程:一文读懂PPP协议
- 批量处理文件,除了 Python,不妨试试 VIM!
- 就是现在!2020 求职加薪手册,人手一份!
- 520 页机器学习笔记!图文并茂可能更适合你
- 开放下载!复旦大学邱锡鹏教授发布教科书《神经网络与深度学习》
- 江苏机器人竞赛南航_中国青少年机器人竞赛
- mfc cstring 写入文件_兄弟Brother单色激光传真一体机MFC系列不能写入此文件夹提示解决方案...
- 05字符串的常用基本操作