Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案

简介: 根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案

导航:

【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析

目录

一、四种基础同步策略

1.1 同步策略

1.2 更新缓存还是删除缓存?

1.2.1 更新缓存的优缺点

1.2.2 删除缓存的优缺点(推荐)

1.3 先操作数据库还是先删除缓存?

1.3.1 先删除缓存再操作数据库的优缺点

1.3.2 先操作数据库再删除缓存的优缺点(推荐)

1.4 最优同步策略:先更新数据库、再删除缓存

二、同步删除+可靠消息方案

三、延时双删:更高一致性方案

四、异步监听+可靠消息删除方案

五、多重保障:最终强一致方案


一、四种基础同步策略

1.1 同步策略

保证缓存和数据库的双写一致性,共有四种同步策略,即先更新缓存再更新数据库、先更新数据库再更新缓存、先删除缓存再更新数据库、先更新数据库再删除缓存。

  • 先更新缓存再更新数据库:第二步失败缓存库是脏数据
  • 先更新数据库再更新缓存:第二步失败缓存库是旧数据
  • 先删除缓存再更新数据库:第二步失败缓存库是空数据
  • 先更新数据库、再删除缓存(推荐):第二步失败缓存库是旧数据

1.2 更新缓存还是删除缓存?

1.2.1 更新缓存的优缺点

更新缓存的优点是每次数据变化时都能及时地更新缓存,这样不容易出现查询未命中的情况,但这种操作的消耗很大,如果数据需要经过复杂的计算再写入缓存的话,频繁的更新缓存会影响到服务器的性能。如果是写入数据比较频繁的场景,可能会导致频繁的更新缓存却没有业务来读取该数据。

1.2.2 删除缓存的优缺点(推荐)

删除缓存的优点是操作简单,无论更新的操作复杂与否,都是直接删除缓存中的数据。这种做法的缺点则是,当删除了缓存之后,下一次容易出现未命中的情况,那么这时就需要再次读取数据库。

那么对比而言,删除缓存无疑是更好的选择

1.3 先操作数据库还是先删除缓存?

1.3.1 先删除缓存再操作数据库的优缺点

情况1:数据库和缓存内容不一致

线程1删除缓存后还没有来得及更新数据库时,线程2读缓存,由于缓存中的数据已经被线程1清空了所以线程2需要去数据库读数据,然后把读到的结果保存到缓存中。此时线程1更新更新数据库成功。就会出现数据库和缓存内容不一致。

情况2:缓存击穿,数据库卡死

线程1删除缓存后还没有来得及更新数据库时,来了大量的读请求,由于缓存中没有数据,导致缓存击穿直接将大量请求访问到数据库,导致数据库崩溃。

1.3.2 先操作数据库再删除缓存的优缺点(推荐)

脏数据问题:先操作数据库但删除缓存失败的话,导致缓存库里一直存留着旧数据,而我们数据库里存的是新数据。

解决办法:异步重试机制

出现上述问题的时候,我们一般采用重试机制解决,而为了避免重试机制影响主要业务的执行,一般建议重试机制采用异步的方式执行。当我们采用重试机制之后由于存在并发,先删除缓存依然可能存在缓存中存储了旧的数据,而数据库中存储了新的数据,二者数据不一致的情况。

1.4 最优同步策略:先更新数据库、再删除缓存

所以我们得到结论:先更新数据库、再删除缓存是影响更小的方案。如果第二步出现失败的情况,则可以采用重试机制解决问题。

同步删除方案: 先更新数据库、再删除缓存。适用于不强制要求数据一致性的情景

流程:先更新数据库、再删除缓存。

问题:

  • 并发时脏数据:在查询数据库到写缓存期间其他线程执行了一次更新删除,导致缓存的数据是旧数据
  • 缓存删除失败:删除失败导致缓存库还是旧数据

二、同步删除+可靠消息方案

同步删除+可靠消息删除: 适用于不强制要求数据一致性的情景

流程:先更新数据库、再删除缓存,如果删除失败就发可靠MQ不断重试删除缓存,直到删除成功或重试5次。

问题:MQ多次重试失败,导致长期脏数据。

三、延时双删:更高一致性方案

延时双删方案:比同步删除策略一致性更高的方案。

流程:先删除缓存再更新数据库,大约在数据库从库更新后再删一次。

问题:时间无法控制,不能保证在数据库从库更新后删除缓存。如果在从库更新前删除,用户再在更新前查从库又把脏数据写在缓存里了。

四、异步监听+可靠消息删除方案

异步监听+可靠消息删除:很多大厂正在使用的方案。

流程:

  1. 更新数据库后不做操作;
  2. Canal等组件监听binlog发现有更新时就发可靠MQ删除缓存;
  3. 如果删除缓存失败,就基于手动ack、retry等机制,让消息在有限次数之内不断重试。

image.gif

优点:

  • 异步删除,性能更高;
  • 可靠消息重试机制,多次删除保证删除成功。

问题:要求canal等binlog抓取组件高可用,如果canal故障,会导致长期脏数据。

五、多重保障:最终强一致方案

多重保障方案:同步删除+ 异步监听+可靠消息删除,缓存时设置过期时间,查询时强制主库查;适合于强制要求数据一致性的情况

  1. 同步删除:先更新数据库、再删除缓存;之后本链路禁止再查该数据,防止没来得及删缓存就又查到旧缓存数据。
  2. Canal监听:Canal等组件监听binlog发现有更新时就发可靠MQ删除缓存;第二重保证删缓存成功;
  3. 延迟消息校验一致性:Canal等组件监听binlog,发延迟MQ,N秒后校验缓存一致性;
  4. 缓存过期时间:每次缓存时设置过期时间;第三重保证删缓存成功;
  5. 强制Redis主库查:以后查缓存时强制从缓存主库查;因为主从同步有延迟,同时不用担心主库压力大,因为分片集群机制。
相关实践学习
5分钟轻松打造应对流量洪峰的稳定商城交易系统
本实验通过SAE极速部署一个微服务电商商城,同时结合RocketMQ异步解耦、削峰填谷的能力,带大家体验面对流量洪峰仍旧稳定可靠的商城交易系统!
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
打赏
0
5
5
0
84
分享
相关文章
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
123 5
【YashanDB知识库】OM仲裁节点故障后手工切换方案和yasom仲裁重新部署后重新纳管数据库集群方案
本文介绍了主备数据库集群的部署、OM仲裁故障切换及重新纳管的全过程。首先通过解压软件包并调整安装参数完成数据库集群部署,接着说明了在OM仲裁故障时的手动切换方案,包括关闭自动切换开关、登录备节点执行切换命令。最后详细描述了搭建新的yasom仲裁节点以重新纳管数据库集群的步骤,如生成配置文件、初始化进程、执行托管命令等,确保新旧系统无缝衔接,保障数据服务稳定性。
|
4月前
|
Redis Pipeline介绍 ---- 提高操作Redis数据库的执行效率。
Redis Pipeline是提高Redis执行效率的重要技术,通过批量发送命令,显著减少了网络往返次数,提高了系统的吞吐量和性能。在实际应用中,合理使用Pipeline可以有效优化Redis的性能,特别是在需要批量操作的场景下。本文通过Python和Java的示例代码展示了如何实现和使用Redis Pipeline,为开发者提供了具体的操作指南。
131 16
Redis原理—2.单机数据库的实现
本文概述了Redis数据库的核心结构和操作机制。
Redis原理—2.单机数据库的实现
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
155 9
【YashanDB 知识库】OM 仲裁节点故障后手工切换方案和 yasom 仲裁重新部署后重新纳管数据库集群方案
本文介绍了一主一备数据库集群的部署步骤。首先在OM节点上传并解压软件包至指定路径,随后通过调整安装参数、执行安装和集群部署完成数据库设置。接着,在主备节点分别配置环境变量,并查看数据库状态以确认安装成功。最后,针对OM仲裁故障提供了手动切换方案,包括构造故障场景、关闭自动切换开关及使用SQL命令进行主备切换,确保系统高可用性。
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
161 1
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
130 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问