首页 > 数据库 >为什么延迟删除可以保证MYSQL 与redis的一致性?

为什么延迟删除可以保证MYSQL 与redis的一致性?

时间:2024-03-20 11:57:42浏览次数:27  
标签:缓存 请求 删除 redis 读写 db MYSQL 一致性 数据

看过很多保持MYSQL 与redis保持一致性的文章都提到了延迟删除,其实脱离任何业务场景的设计都是不切实际的,所以我会本着一个通用的读写场景去分析为什么延迟删除大概率可以保证MYSQL与redis的最终一致。

通常的读写场景

通常在使用redis作为读写缓存时,我们采用的是cache aside pattern 的形式,这种形式的读写一般是这样,

1,读请求: 从缓存中获取不到数据时,从db中读取数据,然后再set到缓存里。

2,写请求: 修改db中的数据,然后删掉缓存。

这样的模式大概率是不会有问题的,但是会有极小的概率出现读请求中,可能会很长时间存在旧数据,来看一下这个例子, 下面的数字标明了每个步骤执行的顺序。

可以看到在并发环境下,如果读请求先从db中读取了旧数据,然后写请求再去执行修改db,删除缓存的操作,此时读请求再把读取出来的旧db数据 set到缓存中,那么后续的读请求便会会一直读取到旧数据的缓存,除非缓存过期。

image.png

延迟删除是如何解决db与缓存数据不一致的

其实无论是上述缓存模型,还是其他的读写缓存方式,在并发环境下,其实都有可能出现缓存旧数据的问题,其本质原因是,修改缓存的地方不是单协程进行的,多协程修改必然存在并发先后的问题

解决上述不一致的方式是可以延迟写请求中,删除缓存的时间。先来看下读写请求的并发场景,

1,如果读请求发生在写请求前,那么写请求后续删除缓存,是不存在不一致问题的。

2,如果读请求发生在写请求后,那么后续读请求读取出来的数据就是新数据,也不会有问题。

3,如果读写同时发生,但是缓存还未过期,此时也不会有一致性问题。

4,如果读写同时发生,但是缓存过期,这个时候才有可能出现上面缓存中长时间存在旧数据的问题。

基于此,我们可以延迟写请求中删除缓存的时间,因为一般我们数据有段比较长的缓存时间,在最开始读请求更新缓存后,后续的读请求会比较长时间读取缓存中数据,我们让写请求等待(可以同步,也可以异步)最开始更新缓存的读请求结束,然后再去删除缓存,就避开了读写请求并发更新缓存的场景,这样,下次读请求就不会读取到旧db数据缓存,而是重新从db中获取新数据。

具体等待多长时间才进行缓存删除,需要根据业务读请求接口的处理时长自己决定。

标签:缓存,请求,删除,redis,读写,db,MYSQL,一致性,数据
From: https://www.cnblogs.com/hobbybear/p/18084904

相关文章

  • MySQL 大表丝滑变更 (online schema change)
    近接到业务需求,要对1张6千万数据量和1张2千万数据量的,MySQL大表进行增加字段,增加索引变更,为不锁表影响业务,调研后决定使用pt-online-schema-change工具操作,现详细记录如下。什么是大表一张MySQL表的数据量如果在千万级或以上,则可以认定为大表。如果在百万级,但是字段数量非......
  • PHP无法连接MySQL8.0数据库问题处理 报错如下: SQLSTATE[HY000]
    PHP无法连接MySQL8.0数据库问题处理报错如下:SQLSTATE[HY000][2054]Theserverrequestedauthenticationmethodunknowntotheclient发生这种错误,是由于MySQL8默认使用了新的密码验证插件:caching_sha2_password,而之前的PHP版本中所带的mysqlnd无法支持这种验证。解决这个问......
  • 在Linux中,MySQL数据库日常运维中涉及哪些关键任务?
    在Linux环境下,MySQL数据库的日常运维涉及到一系列关键任务,旨在保证数据库的稳定性、性能和数据完整性。以下是一些核心运维任务:性能监控与调优使用MySQL自身的SHOWSTATUS、SHOWVARIABLES、EXPLAIN等命令,或结合第三方工具(如PerconaToolkit、MySQLEnterpriseMonitor、Prom......
  • Go Redis专题精讲
    GoRedis专题精讲一、介绍1.1、客户端列表go-redis提供各种类型的客户端:Redis单节点客户端Redis集群客户端Redis哨兵客户端Redis分片客户端Redis通用客户端go-redis也可以用于kvrocks,kvrocks是分布式键值NoSQL数据库,使用RocksDB作为存储引擎......
  • 040_Windows下MySQL定时备份
    目录定时备份脚本计划任务定时执行定时备份脚本remauther:zhyqremdate:20220929rem******BackupMySQLStart******@echooff::设置时间变量set"Ymd=%date:~0,4%%date:~5,2%%date:~8,2%"::创建存储的文件夹ifnotexist"C:\mysql_backup"md"C:\mysql_backup"......
  • 华为云GeminiDB新版本发布:全面支持Redis 6.2
    华为云GeminiDB是一款兼容Redis协议的弹性KV(Key-Value)数据库,支持远超内存的容量和极致的性能,可支撑用户平滑迁移,在广告、游戏、电商等行业有着广泛的应用。今年3月上线的新版本,GeminiDB已全面支持Redis6.2,用户可在华为云GeminiDB产品官网购买使用。新版本的GeminiDB发布了一系......
  • 关于Redis缓存原理详解
    最近都没看Redis,现在回来温习下,现在从Redis的三大缓存开始重新探一探有多深有多浅(^▽^)  让我来开始知识的醍醐灌顶把!是时候表演真正的技术了。(哔哔哔哔….)  铁子们,看在这么卖力的份上,如果觉得本文对你有帮助的话,请动动你的小手,点个赞哟。接下来就开始我们的Redis的......
  • Redis 主从复制的原理详解
    文章目录:1、复制过程2、数据间的同步3、全量复制4、部分复制5、心跳6、异步复制复制原理1.复制过程复制的过程步骤如下:1、从节点执行slaveof命令2、从节点只是保存了slaveof命令中主节点的信息,并没有立即发起复制3、从节点内部的定时任务发现有主节点的信息,开始使......
  • 详解Redis的持久化RDB和AOF
    Redis的持久化是将内存中的数据同步到硬盘的过程具体来说,Redis支持两种主要的持久化方式:RDB和AOF。RDB(RedisDatabase)简介默认持久化方式RDB会将内存中的数据快照保存到磁盘上的一个二进制文件中。这个文件包含了Redis在某个时间点上的所有数据,包括键值对及其过期时间等......
  • MySQL8设置允许简单密码
    [https://blog.51cto.com/u_16175454/9981004#:~:text=MySQL8设置允许简单密码1登录MySQL数据库首先,使用root用户登录到MySQL数据库。mysql-u,5刷新权限在修改后,需要刷新权限使更改生效。...6验证设置最后,验证设置是否生效。](https://blog.51cto.com/u_16175454/99......