缓存失效方案

一、背景

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166134.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu系统上传文件的多种方法-断网上传-安装包上传-物联网开发维护

一、背景 在全新的Ubuntu系统中,其实是无法执行ifconfig命令的,因为这需要net-tools才能执行。在某些无法连接到外网的情况下,我们常常通过将安装包上传或发送到Ubuntu系统中,解压并安装,以保证相关指令能够执行。 本文…

Python获取微信公众号文章数据

这是一个通过 Python mitmproxy 库 实现获取某个微信公众号下全部文章数据的解决方案。首先需要创建一个 Python 虚拟环境,并进入虚拟环境下: $ python -m venv venv $ venv/Scripts/activate我们需要使用 mitmproxy 库 来建立一个网络代理,…

LeetCode_并查集_DFS_中等_2316.统计无向图中无法互相到达点对数

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] [ai, bi] 表示节点 ai 和 bi 之间有一条无向边。请…

将语义分割的标注mask转为目标检测的bbox

1. 语义分割标签 1.1 labelme工具 语义分割的标签是利用labelme工具进行标注的,标注的样式如下: 1.2 语义分割的标签样式 2. 转换语义分割的标注到目标检测的bbox 实现步骤 (1) 利用标注的json文件生成mask图片(2) 在mask图片中找到目标的bbox矩形框的左上角点和右下角点(…

Redis 之 SessionCallback RedisCallback 使用

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

备忘录模式-撤销功能的实现

在idea写代码的过程中,会经常用到一个快捷键——“crtl z”,即撤销功能。“备忘录模式”则为撤销功能提供了一个设计方案。 1 备忘录模式 备忘录模式提供一种状态恢复机制。在不破坏封装的前提下,捕获对象内部状态并在该对象之外保存这个状态。可以在…

Web自动化测试:测试用例断言!

运行测试用例时,需要判断用例是否执行成功,此时需要有一个我们期望的结果来进行验证。这里unittest中,如果一个case执行的过程中报错,或者我们判断结果不符合期望,就会判定此条用例执行失败,判断的条件主要…

【MySQL】数据库——表操作

文章目录 1. 创建表2. 查看表3. 修改表修改表名add ——增加modify——修改drop——删除修改列名称 4. 删除表 1. 创建表 语法: create table 表名字 ( 列名称 列类型 ) charset set 字符集 collate 校验规则 engine 存储引擎 ; charset set字符集 ,若…

【C++代码】二叉搜索树的最近公共祖先,二叉搜索树中的插入操作,删除二叉搜索树中的节点--代码随想录

题目:二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&a…

小程序中如何使用自定义组件应用及搭建个人中心布局

一,自定义组件 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的…

MSQL系列(四) Mysql实战-索引分析Explain命令详解

Mysql实战-索引分析Explain命令详解 前面我们讲解了索引的存储结构,我们知道了BTree的索引结构,也了解了索引最左侧匹配原则,到底最左侧匹配原则在我们的项目中有什么用?或者说有什么影响?今天我们来实战操作一下&…

Java并发面试题:(七)ThreadLocal原理和内存泄漏

ThreadLocal是什么? ThreadLocal是线程本地存储机制,可以将数据缓存在线程内部。ThreadLocal存储的变量在线程内共享的,在线程间又是隔离的。 ThreadLocal实现原理? ThreadLocal的底层是ThreadLocalMap,每个Thread都…

YOLOv5算法改进(16)— 增加小目标检测层 | 四头检测机制(包括代码+添加步骤+网络结构图)

前言:Hello大家好,我是小哥谈。小目标检测层是指在目标检测任务中用于检测小尺寸目标的特定网络层。由于小目标具有较小的尺寸和低分辨率,它们往往更加难以检测和定位。YOLOv5算法的检测速度与精度较为平衡,但是对于小目标的检测效果不佳,根据一些论文,我们可以通过增加检…

Kafka Tool(Kafka 可视化工具)安装及使用教程

Kafka Tool(Kafka 可视化工具)安装及使用教程 Kafka Tool 工具下载 下载地址 http://www.kafkatool.com/download.html 下载界面 不同版本的Kafka对应不同版本的工具,个人使用的是2.11,所以下载的是最新的2.0.8版本&#xff…

android 13/14高版本SurfaceFlinger出现VSYNC-app/VSYNC-appSf/VSYNC-sf剖析

问题背景: 了解surfaceflinger的vsync同学都可能知道vsync属于一个节拍器,主要用来控制有节奏的渲染,不至于会产生什么画面撕裂等现象。 一般vsync都有会有2部分: app部分vsync,控制各个app可以有节奏的上帧 surfacef…

PyQt学习笔记-获取Hash值的小工具

目录 一、概述1.1 版本信息:1.2 基本信息:1.2.1 软件支持的内容:1.2.2 支持的编码格式 1.3 软件界面图 二、代码实现2.1 View2.2 Controller2.3 Model 三、测试示例 一、概述 本工具居于hashlibPyQtQFileDialog写的小工具,主要是…

【Linux升级之路】8_Linux多线程

目录 一、【Linux初阶】多线程1 | 页表的索引作用,线程基础(优缺点、异常、用途),线程VS进程,线程控制,C多线程引入二、【Linux初阶】多线程2 | 分离线程,线程库,线程互斥&#xff0…

【iOS】使用单例封装通过AFNetworking实现的网络请求

这里写目录标题 前言单例封装网络请求1. 首先创建一个继承于NSObject的单例类,笔者这里以Manager对单例类进行命名,然后声明并实现单例类的初始化方法2.实现完单例的创建方法后我们即可通过AFNetworking中的GET方法进行网络请求3.在Controller文件中创建…

免费活动】11月4日敏捷武林上海站 | Scrum.org CEO 亲临现场

活动介绍 过去的几年里,外界的风云变幻为我们的生活增添了一些不一样的色彩。在VUCA世界的浪潮里,每一个人都成为自己生活里的冒险家。面对每一次的变化,勇于探索未知,迎接挑战,努力追逐更好的自己。 七月&#xff0…

Mysql基础与高级汇总

SQL语言分类 DDL:定义 DML:操作 DCL:控制(用于定义访问权限和安全级别) DQL:查询 Sql方言 ->sql:结构化查询语言 mysql:limit oracle:rownum sqlserver:top 但是存储过程:每一种数据库软件一样SQL语法要求: SQL语句可以单行或多行书写&…