项目中常常会用到redis 作为缓存抵挡大量流量直接冲击数据库mysql,那么必然涉及缓存和数据库数据的一致性(尽量短时间内最终一致性)问题。

导致不一致的原因主要有三种情况:

1:并发下,读取旧数据,覆盖了新缓存

2:读写数据库成功,更新缓存失败

3:服务重启,断电

常见方案有以下几种

1:更新数据库后更新缓存

2:淘汰缓存后,更新数据库

3:延时双删

4:基于MQ延时双删

5:基于订阅mysql binlog 删除缓存

1:更新数据库后更新缓存

实现:首先更新数据库,随后更新缓存

图1

优点:实现简单,不发生cache miss

缺点:较短时间内数据脏读,容易导致数据不一致性

场景:

1:线程A更新数据库后,未更新缓存前,其他线程读取的都为脏数据。

2:线程A更新数据库后,更新缓存失败(线程异常,服务器重启,断电),缓存数据库数据不一致。

2:淘汰缓存后,更新数据库

实现:先删除缓存后再更新DB

图2

优点:实现简单,避免方案1的短暂脏读问题,以及线程在更新DB后更新缓存异常或则重启断电下的缓存不一致问题。

缺点:会发生cache miss,高并发下和数据库主从同步延时严重下容易导致数据不一致性

场景1:高并发场景

写线程A和读线程B在高并发下并发执行

写线程A 删除缓存

读线程B 发生cache miss(缓存不存在)

读线程B 读取数据库旧值

写线程A更新数据库

读线程B更新缓存(旧值)

此时缓存中数据与数据库数据不一致

场景2:mysql 主从同步延时场景

写线程A和读线程B并发执行

写线程A删除缓存

读线程B发生 cache miss

写线程A更新数据库(主库)

数据库主从同步发生较重延时

读线程B读取从库数据(旧值)

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

读线程B更新缓存(旧值)

此时缓存中数据与数据库数据不一致

3:延时双删

实现:删除缓存,更新DB后,延时一段时间再进行缓存删除;

第二次缓存删除操作同步操作或者本机异步操作(提交异步线程池操作)

图片3

优点:较好解决方案2下高并发下或数据库主从同步延时带来的数据不一致。

缺点:发生cache miss;可能发生短暂的数据脏读(旧值刷到缓存中,第二次缓存操作执行之前);第二次删除采用同步操作则会影响用户线程响应时间(需延时),本机异步线程池操作,线程更新失败,机器重启,断电等都可能引起缓存数据库的不一致

4:基于MQ延时双删

实现:发送淘汰缓存MQ消息到延时队列,删除缓存,更新数据库,消费队列进行缓存删除

图片4

优点:解决方案3第二次删除失败和机器重启,断电带来的数据不一致性问题

缺点:发生cache miss;可能发生短暂的数据脏读(旧值刷到缓存中,第二次缓存操作执行之前);引入可靠性消息服务,复杂度变高,同时服务侧引入MQ,性能和稳定性都会有损失。

5:基于订阅mysql binlog 删除缓存

实现:删除缓存,更新数据库;后续异步由其他专门的一个缓存淘汰系统订阅mysql binlog 进行缓存的延时淘汰。

图5

优点:解决方案4 服务侧需额外引入MQ问题。

缺点:发生cache miss;可能发生短暂的数据脏读(旧值刷到缓存中,第二次缓存操作执行之前);引入缓存淘汰系统,复杂度高,成本大。

mysql 多线程 一致性_常见缓存数据库一致性方案(建议收藏)相关推荐

  1. 分布式mysql一致性问题_分布式缓存数据库一致性问题

    缓存和数据库一致性问题,有很多解决方案,没有最完美的方案,只有适合自身业务的尽可能完美的方案. 缓存由于其高并发和高性能的特征,已经在项目中被广泛应用. 查询时一般先查询缓存,如果缓存命中的话,那么直 ...

  2. 【宋红康 MySQL数据库】【03】SQL概述_常见的数据库对象

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库][03]SQL概述_常见的数据库对象 SQL概述 什么是SQL SQL背景知识 SQL分类 DDL(Data Defini ...

  3. mysql软件分为几种_常见的数据库软件有哪几种

    常见的数据库软件介绍: 一.MySQL MySQL是最受欢迎的开源SQL数据库管理系统,它由 MySQL AB开发.发布和支持. MySQL是一个快速的.多线程.多用户.健壮的SQL数据库服务器.My ...

  4. 数据库软件mysql属于哪种类型软件_常见的数据库软件有哪几种

    常见的数据库软件介绍: 一.MySQL MySQL是最受欢迎的开源SQL数据库管理系统,它由 MySQL AB开发.发布和支持. MySQL是一个快速的.多线程.多用户.健壮的SQL数据库服务器.My ...

  5. linux查看mysql实例名_查询oracle数据库的数据库名、实例名、ORACLE_SID

    查询oracle数据库的数据库名.实例名.ORACLE_SID 连接ORACLE 数据库 SQL> conn risenet/1@//192.168.130.99:1521/risenet 或 ...

  6. MySQL数据库操作命令【建议收藏】

    MySQL数据库学习 如果想更多学习更多知识,无论是哪种语言.哪种教程,建议收藏下面网站,这里面是真的全: http://c.biancheng.net/ 系列文章目录 MySQL数据库学习 前言 M ...

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

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

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

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

  9. 跨库一致性_设计跨平台的一致性

    跨库一致性 I offended an Apple employee the other day when I was checking out the new iPad Pro and I told ...

最新文章

  1. 微信小程序模板template
  2. JavaWeb中连接数据库的一般方式与通过JNDI连接池的方式
  3. linux shell 运算符 | || () {}
  4. golang 下划线
  5. angularjs ngTable -Custom filter template-calendar
  6. 修改mysql文件的存储路径
  7. html怎么播放下一首,javascript – HTML5音频播放列表 – 第一个结束后如何播放第二个音频文件?...
  8. linu - 系统延时与定时任务
  9. mysql创建表有则删除_MySQL创建表和删除表
  10. Oracle Dataguard 管理命令
  11. 微软新一代企业应用平台 促进动态IT发展
  12. [ZT]Grub4dos for WinPE 启动菜单
  13. 辰智:2018中国餐饮大数据白皮书
  14. 三菱Q系列通过wifi联服务器,三菱Q系列PLC以太网通讯,三步可以搞定!
  15. 概率论05 - 随机变量及其分布函数
  16. Echarts图表设置x轴y轴均随滚轮滚动缩+放 区域缩放
  17. 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较
  18. python更改进程名称_更改python脚本的进程名称 - python
  19. 逆向小程序破解js神器-(工具篇)
  20. 网络漫画书市场现状研究分析报告-

热门文章

  1. 简简单单实践ERD Commander2005破解Windows密码
  2. 澳洲中本聪Craig Wright涉嫌论文抄袭?
  3. Python实现拉格朗日插值法
  4. 智能合约语言 Solidity 教程系列9 - 错误处理
  5. Veeam Backup Replication v7 安装配置手册
  6. 中国二维码应用被国外标准垄断 信息安全问题频发
  7. NASA 悬赏 10 万招编程高手 世界最令人头疼的编程语言
  8. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
  9. 排除hotnews主题内容页面上的热点图片推荐里的分类-hotnews主题top_hot.php
  10. 使用snmp对DNS服务器进行图形化监控