缓存失效方案

一、背景

WRITE : 数据写入Mysql 和 Redis缓存,

READ:先从 Redis 缓存中取数据,拿不到再从Mysql中加载,更新到Redis

上图第三阶段,接收Mysql的binlog变更消息,可以参考阿里的 Canal,接入 Kafka

二、缓存失效方案

**脏数据定义:**Redis中取到的数据,不是Mysql-Master中的数据

2.1 同步失效(写Mysql后同步失效Redis缓存)

|-----------|------------------------|------------------------------------------------------------------------------------------|
| | 脏数据生成时间窗口 | 脏数据存在时间窗口 |
| Redis有数据 | T0 - T2(小于Mysql主从延迟耗时) | T0 - T2 期间生成的,那么脏数据存在时间是生成那刻 ------ 下次更新前。 |
| Redis没有数据 | T1 - T2 (Mysql主从延迟耗时) | 1、若是 T1 - T0 期间生成的,那么脏数据存在时间 T1 - T0 2、若是 T0 - T2 期间生成的,那么脏数据存在时间是生成那刻 ------ 下次更新前。 |

2.2 接收到Binlog的MQ消息后,失效Redis缓存

|------------|----------------------|------------------------------------------------------|
| | 脏数据生成时间窗口 | 脏数据存在时间窗口 |
| Redis存在数据 | 无,存在缓存不重新生成 | T1 - T0 |
| Redis不存在数据 | T1 - T2(Mysql主从延迟耗时) | 写入Redis那一刻 ------ T0 (Mysql主从延迟耗时 + binlog消息发送与拉取耗时) |

2.3 同步失效 + 接收到Binlog的MQ消息后,失效Redis缓存

|------------|-------------------------------------------------------|-----------------------------------------------------------------|
| | 脏数据生成时间窗口 | 脏数据存在时间窗口 |
| Redis存在数据 | T0 - T2 因为 T1 - T0 期间有缓存,所以不重新生成,那么 肯定是 T0 - T2 期间生成的 | T1 - T5 |
| Redis不存在数据 | T1 - T2(Mysql主从延迟耗时) | 1、若是 T1 - T0 期间生成的,那么脏数据存在时间 T1 - T0 2、若是 T0 - T2 期间生成的,T0 - T5 |

2.4 三种方案对比

|---------------------------|--------------|----------------------------------|---------------------------|
| 方案 | 脏数据生成时机窗口 | 脏数据可能存在的时间窗口 | 改造复杂度 |
| 方案1:同步失效 | MySQL 主从延迟期间 | 可能很长,无法容忍 生成那刻 ------ 下次更新前。 | 中,所有更新操作同步失效 |
| 方案2:监听binlog失效缓存 | MySQL 主从延迟期间 | Mysql主从延迟耗时 + binlog消息发送与拉取耗时 | 简单,接入Binlog统一失效 |
| 方案3:同步失效缓存 + 监听binlog失效缓存 | MySQL 主从延迟期间 | Mysql主从延迟耗时 + binlog消息发送与拉取耗时 | 复杂,接入DTS统一失效 + 所有更新操作同步失效 |

建议:直接方案2 ,方案3 如果存在太多update场景的话,入口太多。

相关推荐
阿萨德528号8 小时前
5、生产Redis高并发分布式锁实战
数据库·redis·分布式·缓存
转身後 默落11 小时前
03.一键编译安装Redis脚本
数据库·redis·缓存
blurblurblun12 小时前
Redis实战(7)-- 高级特性 Redis Stream数据结构与基础命令
数据库·redis·缓存
猫头虎13 小时前
如何在 macOS 上使用 dnsmasq 搭建本地 DNS 缓存/转发
开发语言·macos·缓存·golang·beautifulsoup·beego·go1.19
ldj20201 天前
CentOS上部署Redis及其哨兵(Sentinel)模式
数据库·redis·缓存
我科绝伦(Huanhuan Zhou)1 天前
【故障案例】Redis缓存三大难题:雪崩、击穿、穿透解析与实战解决方案
redis·缓存·mybatis
阿萨德528号1 天前
6、Redis高并发缓存方案和性能优化
运维·redis·缓存·性能优化
元亓亓亓1 天前
Redis--day1--初识Redis
数据库·redis·缓存
会编程的林俊杰1 天前
Redis事务机制
数据库·redis·缓存
程序员JerrySUN2 天前
OpenCV 全解读:核心、源码结构与图像/视频渲染能力深度对比
linux·人工智能·驱动开发·opencv·计算机视觉·缓存·音视频