缓存失效方案

一、背景

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场景的话,入口太多。

相关推荐
Maiko Star3 小时前
基于Redis ZSet实现多维度题目贡献度排行榜
数据库·redis·缓存
pingcode7 小时前
IDEA清除缓存
缓存·intellij-idea
不会写程序的未来程序员7 小时前
Redis 缓存
数据库·redis·缓存
脸大是真的好~7 小时前
黑马消息队列-rabbitMQ2-生产者重连机制-生产者确认机制-数据持久化-LazyQueue-消费者确认机制-失败重试机制-重试耗尽告警手动处理-
java·缓存·中间件
源代码•宸15 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
code bean17 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
武子康18 小时前
Java-193 Spymemcached 深入解析:线程模型、Sharding 与序列化实践全拆解
java·开发语言·redis·缓存·系统架构·memcached·guava
xinyu_Jina18 小时前
动态媒体资源解析器:PWA、离线缓存与用户数据隐私的架构设计
缓存·媒体
闲人编程1 天前
中间件开发与生命周期管理
缓存·中间件·生命周期·日志·扩展·codecapsule
RoboWizard1 天前
双接口移动固态硬盘兼容性怎么样?
人工智能·缓存·智能手机·电脑·金士顿