当前位置: 首页 > news >正文

Redis中缓存穿透、击穿、雪崩以及解决方案

目录

一、Redis 介绍

二、Redis 缓存穿透

三、Redis 缓存击穿

四、Redis 缓存雪崩


一、Redis 介绍

Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和有序集合(sorted sets)等。

Redis是基于内存的数据库,因此具有出色的性能。它将数据存储在内存中,提供快速的读写操作。此外,Redis还提供持久化功能,可以将数据保存在磁盘上,以便在重启后恢复数据。

Redis具有以下特点:

  1. 简单易用:Redis提供了简单的键值对操作,使得开发人员可以轻松地使用和理解。
  2. 高性能:由于数据存储在内存中,Redis具有快速的读写速度。此外,它还可以将热点数据缓存到内存中,加速应用程序的响应速度。
  3. 数据结构丰富:Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合等,这使得开发人员可以灵活地处理不同类型的数据。
  4. 支持持久化:Redis提供了两种持久化方式,分别是RDB(Redis Database)和AOF(Append Only File),可以将数据保存在磁盘上,以便在重启后恢复数据。
  5. 高可用性:Redis支持主从复制和哨兵模式,可以实现数据的备份和故障转移,提高系统的可用性。
  6. 发布订阅功能:Redis提供了发布订阅机制,可以实现消息的发布和订阅,用于构建实时推送和消息队列等功能。

总之,Redis是一个功能强大且易于使用的数据存储系统,被广泛应用于缓存、会话存储、排行榜、实时分析和消息队列等场景。

二、Redis 缓存穿透

Redis缓存穿透是指在使用Redis作为缓存时,请求的数据在缓存中不存在,导致请求绕过缓存直接访问数据库。这种情况通常发生在恶意攻击或者频繁请求不存在的数据时。

缓存穿透可能造成以下问题:

  1. 压力增大:当大量请求绕过缓存直接访问数据库时,数据库的压力会大幅增加,可能导致数据库性能下降甚至崩溃。

  2. 数据不一致:由于缓存中没有相关数据,每次请求都会访问数据库,导致缓存与数据库数据不一致。

为了解决Redis缓存穿透问题,可以采取以下措施:

  1. 布隆过滤器(Bloom Filter):在缓存层之前加入布隆过滤器,用于过滤掉不存在的数据。布隆过滤器是一种高效的数据结构,用于判断某个元素是否存在于集合中,可以快速过滤掉不存在的数据,减轻数据库的压力。

  2. 缓存空对象:当数据库中不存在某个数据时,可以将空对象(如null)缓存到Redis中,避免频繁访问数据库。在缓存中设置一个较短的过期时间,以避免缓存一直存在。

  3. 异常数据缓存:当发现某些请求频繁访问不存在的数据时,可以将这些请求的结果缓存下来,避免再次请求时绕过缓存。

  4. 数据预热:在系统启动时,将常用的数据加载到缓存中,提前预热缓存,减少缓存穿透的概率。

  5. 接口限流:对于频繁请求不存在数据的接口,可以进行限流,限制请求的频率,减轻数据库的压力。

三、Redis 缓存击穿

Redis缓存击穿是指在高并发的情况下,一个热点数据失效,导致大量请求直接访问数据库,造成数据库压力过大,降低系统性能。具体的缓存击穿情况如下:

  1. 热点数据失效:缓存中存储了某个热门数据,但是由于某种原因(例如过期或被手动删除),该数据被从缓存中移除。
  2. 并发请求访问:在热点数据失效的瞬间,大量并发请求同时访问该数据,导致缓存中没有数据可用。
  3. 请求直接访问数据库:由于缓存中没有数据,请求直接访问数据库获取数据,这会造成数据库负载过大,甚至引起数据库崩溃。

为了解决缓存击穿问题,可以采取以下方式:

  1. 设置热点数据永不过期:对于热点数据,可以设置其缓存时间为永不过期,确保数据始终可用。
  2. 加锁机制:在缓存失效的瞬间,通过加锁机制来保证只有一个请求能够访问数据库,其他请求等待获取缓存数据。
  3. 延迟双删策略:在热点数据失效时,先更新缓存中的数据,并设置一个较短的过期时间,然后再去访问数据库获取新的数据,并更新缓存。这样可以避免大量请求同时访问数据库。
  4. 异步更新缓存:当缓存失效时,不立即去访问数据库,而是先返回旧的缓存数据,并异步更新缓存中的数据,避免请求直接访问数据库。

四、Redis 缓存雪崩

Redis缓存雪崩是指在一个特定时间段内,缓存中的大量数据同时失效,导致大量请求直接访问数据库,造成数据库压力过大,甚至引发系统崩溃的情况。主要原因是缓存数据失效时间一致或者缓存服务宕机等问题。

解决缓存雪崩问题的常见方案如下:

  1. 设置缓存失效时间随机性:通过为缓存设置随机的失效时间,避免大量缓存同时失效,减轻数据库压力。
  2. 使用互斥锁机制:在缓存失效的瞬间,通过互斥锁的方式只允许一个请求去访问数据库并重新生成缓存,其他请求等待获取已生成的缓存。
  3. 数据预热:在系统低峰期,提前对热点数据进行加载和缓存,避免大量数据同时失效。
  4. 分布式部署:将缓存服务进行分布式部署,通过多个节点来分担缓存的压力,提高系统的容灾性。
  5. 引入备份机制:在缓存失效时,通过备份机制(如热备份或冷备份)来保证系统的可用性,当缓存失效时可以快速切换到备份缓存。
  6. 使用缓存击穿解决方案:如布隆过滤器或者使用二级缓存,可以在缓存失效的情况下快速判断请求的数据是否存在,避免直接访问数据库。

相关文章:

  • PHP如何实现邮箱验证
  • 如何解决ajax浏览器缓存
  • 微信小程序保存二维码的过程
  • 构建第一个ArkTS应用(纯HarmonyOS应用)
  • 打印菱形图案C语言
  • C++服务器 支持http、tcp protobuf、websocket,linux开源框架 零依赖轻松编译部署 Reactor
  • SCAU:前一个和后一个字符
  • JAVA代码优化:Easy Excel(操作Excel文件的开源工具)
  • 基于ssm Vue的戒烟网站源码和论文
  • 实时流式计算 kafkaStream
  • 【算法思考记录】力扣2653. 滑动子数组的美丽值【C++,滑动窗口】
  • 【算法】希尔排序
  • HR看好的字符函数和字符串处理函数!!!
  • [MySQL]日期和时间函数
  • 计算机网络体系的形成
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • JavaScript 一些 DOM 的知识点
  • js继承的实现方法
  • log4j2输出到kafka
  • magento2项目上线注意事项
  • SpringCloud集成分布式事务LCN (一)
  • Spring框架之我见(三)——IOC、AOP
  • supervisor 永不挂掉的进程 安装以及使用
  • win10下安装mysql5.7
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 简单实现一个textarea自适应高度
  • 聊聊redis的数据结构的应用
  • 模型微调
  • 如何进阶一名有竞争力的程序员?
  • 学习笔记:对象,原型和继承(1)
  • # centos7下FFmpeg环境部署记录
  • #162 (Div. 2)
  • (0)Nginx 功能特性
  • (175)FPGA门控时钟技术
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Oracle)SQL优化技巧(一):分页查询
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)php新闻发布平台 毕业设计 141646
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转) ns2/nam与nam实现相关的文件
  • (转)C#调用WebService 基础
  • (转)Linux下编译安装log4cxx
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .CSS-hover 的解释
  • .describe() python_Python-Win32com-Excel
  • .net core Swagger 过滤部分Api
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Remoting学习笔记(三)信道
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET分布式缓存Memcached从入门到实战