为什么延迟删除可以保证MYSQL 与redis的一致性?
看过很多保持MYSQL 与redis保持一致性的文章都提到了延迟删除,其实脱离任何业务场景的设计都是不切实际的,所以我会本着一个通用的读写场景去分析为什么延迟删除大概率可以保证MYSQL与redis的最终一致。
通常的读写场景
通常在使用redis作为读写缓存时,我们采用的是cache aside pattern
的形式,这种形式的读写一般是这样,
1,读请求: 从缓存中获取不到数据时,从db中读取数据,然后再set到缓存里。
2,写请求: 修改db中的数据,然后删掉缓存。
这样的模式大概率是不会有问题的,但是会有极小的概率出现读请求中,可能会很长时间存在旧数据,来看一下这个例子, 下面的数字标明了每个步骤执行的顺序。
可以看到在并发环境下,如果读请求先从db中读取了旧数据,然后写请求再去执行修改db,删除缓存的操作,此时读请求再把读取出来的旧db数据 set到缓存中,那么后续的读请求便会会一直读取到旧数据的缓存,除非缓存过期。
延迟删除是如何解决db与缓存数据不一致的
其实无论是上述缓存模型,还是其他的读写缓存方式,在并发环境下,其实都有可能出现缓存旧数据的问题,其本质原因是,修改缓存的地方不是单协程进行的,多协程修改必然存在并发先后的问题。
解决上述不一致的方式是可以延迟写请求中,删除缓存的时间。先来看下读写请求的并发场景,
1,如果读请求发生在写请求前,那么写请求后续删除缓存,是不存在不一致问题的。
2,如果读请求发生在写请求后,那么后续读请求读取出来的数据就是新数据,也不会有问题。
3,如果读写同时发生,但是缓存还未过期,此时也不会有一致性问题。
4,如果读写同时发生,但是缓存过期,这个时候才有可能出现上面缓存中长时间存在旧数据的问题。
基于此,我们可以延迟写请求中删除缓存的时间,因为一般我们数据有段比较长的缓存时间,在最开始读请求更新缓存后,后续的读请求会比较长时间读取缓存中数据,我们让写请求等待(可以同步,也可以异步)最开始更新缓存的读请求结束,然后再去删除缓存,就避开了读写请求并发更新缓存的场景,这样,下次读请求就不会读取到旧db数据缓存,而是重新从db中获取新数据。
具体等待多长时间才进行缓存删除,需要根据业务读请求接口的处理时长自己决定。
为什么延迟删除可以保证MYSQL 与redis的一致性?的更多相关文章
- PHP商品秒杀问题解决方案实例详解【mysql与redis】
本文实例讲述了PHP商品秒杀问题解决方案.分享给大家供大家参考,具体如下: 引言 假设num是存储在数据库中的字段,保存了被秒杀产品的剩余数量. if($num > 0){ //用户抢购成功,记 ...
- Mysql和Redis数据如何保持一致
先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性:Redis是用来当缓存,用来提升数据访问的性能. 关于如何保证Mysql和Redis中的数据一致 ...
- python学习道路(day12note)(mysql操作,python链接mysql,redis)
1,针对mysql操作 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass'); 设置密码 update user set password ...
- 通过Gearman实现MySQL到Redis的数据同步
对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
MySQL到Redis数据复制方案 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来 ...
- python访问mysql和redis
1. 修改mysql配置文件 修改bind-address=0.0.0.0(允许通过远程网络连接) 2. 修改redis配置文件 修改bind-address=0.0.0.0(允许通过远程网络连接), ...
- 电商中的库存管理实现-mysql与redis
库存是电商系统的核心环节,如何做到不少卖,不超卖是库存关心的核心业务问题.业务量大时带来的问题是如何更快速的处理库存计算. 此处以最简模式来讨论库存设计. 以下内容只做分析,不能直接套用,欢迎 ...
- MySQL与Redis实现二级缓存
redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化, ...
- python笔记7:mysql、redis操作
模块安装: 数据操作用到的模块pymysql,需要通过pip install pymysql进行安装. redis操作用的模块是redis,需要通过pip install redis进行安装. 检验是 ...
- 06 python操作MySQL和redis(进阶)
python操作mysql.redis 阶段一.mysql事务 主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息, ...
随机推荐
- Pandas数据合并
目录 1) 在单个键上进行合并操作 2) 在多个键上进行合并操作 使用how参数合并 1) left join 2) right join 3) outer join(并集) 4) inner joi ...
- NC22594 Rinne Loves Graph
题目链接 题目 题目描述 Island 发生了一场暴乱!现在 Rinne 要和 Setsuna 立马到地上世界去. 众所周知:Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些 ...
- STC89C52驱动MAX7219LED点阵级联, 文字滚动效果
级联下的传值方式 级联下, N个MAX7219相当于组成了一个8*N bit宽度的锁存器, 如果需要对第M个7219进行写入, 需要做M次寻址+写入后拉高CS, 才能到达这个7219. 如果仅仅对这个 ...
- 基于keras的胶囊网络(CapsNet)
1 简介 胶囊网络(CapsNet)由 Hinton 于2017年10月在<Dynamic Routing Between Capsules>中提出,目的在于解决 CNN 只能提取特征,而 ...
- Spring Cloud Gateway微服务网关快速入门
介绍 Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,Spring C ...
- letcode-K个一组翻转链表(栈思想 + 递归)
题目:输入一个有序链表,每K个一组进行反转. 输入:1, 2, 3, 4, 5, 5, 6, 8, 10 K = 3 输出:3, 2, 1, 5, 5, 4, 10, 8, 6 题解 反转,那么最先想 ...
- 开源大语言模型作为 LangChain 智能体
概要 开源大型语言模型 (LLMs) 现已达到一种性能水平,使它们适合作为推动智能体工作流的推理引擎: Mixtral 甚至在我们的基准测试中 超过了 GPT-3.5,并且通过微调,其性能可以轻易的得 ...
- std::string std::wstring char w_char 内部中文编码
最近在处理一个字符串转码问题,故记录一下过程 该需求是外部 sdk 的一个 api 需要一个 char* 字符串路径入参,我以往是将宽字符串转为 UTF8 后再传给 sdk 这次这个 api 似乎不接 ...
- 亲测CentOS 8.2更换yum源报错Errors during downloading metadata for repository 'epel': - Status code解决办法
重点 提一件拉胯的事:别去参考阿里和华为云官方镜像上面的解决办法,本人试了几遍,没luan用.拉胯!!!!!!!! 报错具体信息 Errors during downloading metadata ...
- 【Azure Service Bus】使用Spring Cloud integration示例代码,为多个 Service Bus的连接使用 ConnectionString 方式
问题描述 查看Service Bus的Java示例代码,发现使用Spring Cloud Integration,配置 Application.yaml 可以连接到两个Service Bus. 但代码 ...