首页 > 数据库 >【博学谷学习记录】超强总结,用心分享|狂野架构师Redis双写一致性、延迟双删策略

【博学谷学习记录】超强总结,用心分享|狂野架构师Redis双写一致性、延迟双删策略

时间:2022-09-18 23:34:01浏览次数:95  
标签:缓存 双删 redis 数据库 Redis 更新 线程 架构师 数据

目录

Redis数据双写一致性

缓存可以提升性能,缓解数据库压力,但是同时缓存也会出现缓存和数据库数据不一致的问题。

如果数据不一致,就会导致应用在缓存中读取的不是最新的数据,

不考虑并发的情况下,不论谁先谁后,都可以让两者保持一致。但现在我们需要重点考虑异常的情况,也就是“第一步成功、第二步失败”的情况。

无并发时可能存在的问题

1、先更新缓存,后更新数据库

如果缓存更新成功了,但数据库更新失败,那么此时缓存中是最新值,但数据库中是旧值,数据不一致。

2、先更新数据库,后更新缓存

如果数据库更新成功了,但缓存更新失败,那么此时数据库中是最新值,缓存中是旧值。之后的读请求读到的都是旧数据,只有当缓存失效后,才能从数据库中得到正确的值。

并发的情况下,即使不发生异常,也容易

3、并发下 先删除缓存,后更新数据库

如果有 2 个线程要并发「读写」数据,可能会发生以下场景:

1、线程 A 要更新 X = 2(原值 X = 1)

2、线程 A 先删除缓存

3、线程 B 读缓存,发现不存在,从数据库中读取到旧值(X = 1)

4、线程 A 将新值写入数据库(X = 2)

5、线程 B 将旧值写入缓存(X = 1)

结果:数据不一致

4、并发下先更新数据库,后删除缓存

依旧是 2 个线程并发读写数据:

  1. 缓存中 X 不存在(数据库 X = 1)
  2. 线程 A 读取数据库,得到旧值(X = 1)
  3. 线程 B 更新数据库(X = 2)
  4. 线程 B 删除缓存
  5. 线程 A 将旧值写入缓存(X = 1)

结果:数据不一致

常用方案:延迟双删策略。

延时双删:

1、删除缓存

redis延时双删第一个删除是为了什么?
如果不删第一次的话,就相当于先更新库后删缓存,这种情况下如果删缓存失败了就会有一致性问题;而先删缓存再删库,删数据库失败了也就是多一次cache miss,

2、更新数据库

3.休眠一定时间

4、再次删除缓存

为什么要延时呢?因为 mysql 和 redis 主从节点数据不是实时同步的,同步数据需要时间。

数据工作的大致流程:

服务节点删除 redis 主库数据。
服务节点修改 mysql 主库数据。
服务节点使得当前业务处理 等待一段时间,等 redis 和 mysql 主从节点数据同步成功。
服务节点从 redis 主库删除数据。
当前或其它服务节点读取 redis 从库数据,发现 redis 从库没有数据,从 mysql 从库读取数据,并写入 redis 主库。

标签:缓存,双删,redis,数据库,Redis,更新,线程,架构师,数据
From: https://www.cnblogs.com/xieshier/p/16706265.html

相关文章

  • Redis详细教程笔记
    1.目录2.待更新:集群环境搭建、订阅发布、哨兵机制、主从复制、缓存雪崩与穿透3.笔记链接:https://t.wss.ink/f/9bktugzrk5n复制链接到浏览器打开(过期联系:QQ:8108062......
  • 【Java面试】面试遇到宽泛的问题,这么回答就稳了,谈谈你对Redis的理解
    “谈谈你对Redis的理解”!面试的时候遇到这类比较宽泛的问题,是不是很抓狂?是不是不知道从何开始说起?没关系,今天我用3分钟教你怎么回答。大家好,我是Mic,一个工作了14年的......
  • redis的配置文件
    redis的配置文件开头INCLUDES(包含)当redis有多个其他配置时就可以使用include来引入,类似spring中的import,如果想要覆盖其中的配置参数需要把include放到最后来设置。......
  • Redis基础
    一、Redis入门1.认识NoSQL1.1 什么是NoSQLNoSQL最常见的解释是"non-relational",很多人也说它是"NotOnlySQL"NoSQL仅仅是一个概念,泛指非关系型的数据库区别于关系......
  • redis面试题汇总
     1redis持久化机制 redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化,当redis重启后通过把硬盘文件重新加载到内存,就能......
  • Redis 用 IConnectionMultiplexer 连接 订阅消息
    创建订阅类:usingStackExchange.Redis;namespaceTestWebApplication.BackgroundTasks{///<summary>///Redis订阅者,长时间运行的后台服务///</su......
  • 本地连不上远程服务器的Redis
    本地连不上远程服务器的Redis注意:Redis安装在linux虚拟机上1.检查连接远程服务器ip地址是否正确在linux中:ifconfig2.检查远程服务器防火墙是否关闭(关闭或者设置......
  • Redis介绍与安装
    2022-09-17NoSQL(notonlySQL)的介绍:是一种非关系型数据库。NoSQL常用的产品种类:RedisMongodbHbasehadoopRedis常用的场景:(1)可用于缓冲,即内......
  • 05--Redis高级:持久化、主从复制、哨兵、集群、redis做缓存
    1redis持久化#持久化redis的所有数据保存在内存中,对数据更新将异步的保存到硬盘上#实现方式#1.快照(全量复制):某时某刻数据的一个完整备份-mysql的......
  • Redis出现的原因
    Redis出现的原因1、冯诺依曼计算机硬件体系决定了磁盘的使用量会越来越大,导致IO交互的速度会越来越慢2、网络带宽的不够稳定,也是其中的一个原因,因为磁盘的IO操作主要就是......