MySQL和Redis的数据一致性

MySQL和Redis的数据一致性

多线程环境下的涉及读写的缓存才会存在MySQL和Redis的数据不一致问题

先删除缓存再更新数据库再延时删除缓存
  1. 线程一删除缓存
  2. 线程一更新数据
  3. 线程二开始查数据
  4. 如果第二步线程一更新数据延时,那么线程二会重新从数据库加载数据,并将失效的数据设置到缓存
  5. 线程一更新完成数据库值之后,第二次延时删除缓存;延时删除是因为可能存在线程二查库返回失效数据还未将失效数据设置到缓存中时,线程一更新了数据库并立即删除了缓存,此时线程二会再一次将失效数据设置到缓存中,所以需要延时删除缓存,具体延时需要根据系统并发业务量判断
先更新数据库再删除缓存
  1. 线程一更新数据库
  2. 线程二开始读取缓存,在线程一还未删除缓存的时候,线程二一直读取失效数据
  3. 线程一删除缓存


双删机制还是会有概率导致MySQL和Redis的数据一致性,特别是当你第二次延时删除时间设置的不合适的时候,所以建议使用先更新数据库再删除缓存的方式,这样可以保证数据库的最终一致性。无论是哪一种删除机制都会存在缓存删除失败的情况,所以要引入缓存删除重试机制。下面是两种缓存删除重试机制

引入MQ缓存删除重试
  1. 更新数据库完成之后删除缓存
  2. 如果缓存删除失败,异步向MQ发送删除失败的缓存key
  3. 应用程序监听MQ,重试缓存删除,如果一直失败超过一定次数需要通知运维人员人工介入
引入MySQL的binlog订阅机制监听数据库数据变动处理缓存更新

和上面不一样的地方在于,我们使用的独立的Canal客户端订阅MySQL的binlog日志来执行缓存删除,而不是由主线程在更新数据库之后删除缓存,这在一定程度上实现了业务数据更新和缓存删除的解耦

相关推荐
Elastic 中国社区官方博客几秒前
Elasticsearch:智能搜索 - AI builder,workflow 及 skills
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
u0109147601 分钟前
如何通过后端 API 同时向两个 Webhook 发送表单数据
jvm·数据库·python
运维全栈笔记2 分钟前
K8S部署MySQL主从复制实现高可用数据库
mysql·adb·云原生·容器·系统架构·kubernetes·kubelet
jialan753 分钟前
上海服务器 CentOS7.6 mysql8 redis jdk17 Tomcat10
运维·服务器·redis
步辞4 分钟前
CSS如何对表单输入框获取焦点时实现标签上浮过渡
jvm·数据库·python
瀚高PG实验室7 分钟前
类型转换导致SQL不走索引的案例
数据库·sql·瀚高数据库
qq_432703667 分钟前
c++怎么在不使用STL的情况下利用Win32 API进行低级文件IO【底层】
jvm·数据库·python
池佳齐10 分钟前
软考高级系统架构设计师备考(二十七):软件工程—系统运行与软件维护
数据库·系统架构
qq_372906931 小时前
mysql用户无法访问存储过程权限提示_MySQL EXECUTE赋权方案
jvm·数据库·python
脏脏a1 小时前
监控面板全绿但用户说网站打不开?Prometheus+Blackbox从外部验证服务真实可用性
数据库·prometheus