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日志来执行缓存删除,而不是由主线程在更新数据库之后删除缓存,这在一定程度上实现了业务数据更新和缓存删除的解耦

相关推荐
King of fraud5 小时前
Linux 下 MySQL 基础操作:创建用户、数据库与权限管理实战
linux·数据库·mysql
努力的小雨6 小时前
sys_basebackup 适合什么场景,先看恢复目标
数据库
这个DBA有点耶6 小时前
Redis大key“根治”指南:拆分策略与数据结构选型
数据库·mysql·架构
程序员与背包客_CoderZ6 小时前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
进击的_鹏6 小时前
从零开始的 Redis 学习
服务器·数据库·c++·redis·缓存
隔窗听雨眠6 小时前
当KES遇到多租户:金仓数据库多租户架构的隔离实践与部署指南
数据库·架构
JOker_Chu_7 小时前
知识图谱详解:从图结构、关系建模到查询与应用
数据库·知识图谱·database·neo4j
tryCbest7 小时前
搭建企业知识库之Milvus 向量数据库
数据库·milvus
czhc11400756637 小时前
2026-08-24 博客:几个让你少踩坑的概念
数据库
ACP广源盛139246256738 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 Serdes 长距离视频传输芯片 GSV5800 在私有化 AI 服务中的价值与应用场景
大数据·数据库·人工智能·嵌入式硬件·矩阵·开源·音视频