首页 > 数据库 >redis中穿透、雪崩、击穿的理解

redis中穿透、雪崩、击穿的理解

时间:2024-10-30 09:36:19浏览次数:1  
标签:缓存 请求 过期 redis DB 击穿 雪崩 key

一、穿透、雪崩、击穿的理解

redis充当缓存图

穿透、雪崩、击穿本质上都是查询redis数据库时没有数据从而去查业务数据库

  • 1、缓存穿透:(要查询的数据根本不存在)
    是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。
    当请求查询一个不存在于缓存中,也不存在于后端数据源中的数据时,每次请求都会直接访问后端数据源。这可能导致后端系统负载增加,甚至引起拒绝服务攻击。

  • 2、缓存雪崩:(一批数据有,但是过期时间到了)
    简单的理解为:由于原有缓存失效,新缓存未到时间 (例如:设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。指的是当针对一个热点数据的并发请求同时失效,导致大量请求落到后端数据源上,压垮后端数据库或造成服务不可用。

  • 3、缓存击穿:(针对某一个数据突然过期,直接查数据库)
    某个 key 非常非常热,访问非常的频繁,高并发访问的情况下,当这个 key在失效(可能expire过期了,也可能LRU淘汰了)的瞬间,大量的请求进来,这时候就击穿了缓存,直接请求到了数据库,一下子来这么多,数据库肯定受不了,这就叫缓存击穿。某个key突然失效,然后这时候高并发来访问这个key,结果缓存里没有,都跑到db了。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。缓存雪崩指的是当缓存中大量的数据同时过期,导致大量请求落到后端数据源上,造成数据库压力过大甚至服务不可用。

三者出现的根本原因是:Redis缓存命中率下降,请求直接打到DB上了

正常情况下,大量的资源请求都会被redis响应,在redis得不到响应的小部分请求才会去请求DB,这样DB的压力是非常小的
如果大量的请求在redis上得不到响应,那么就会导致这些请求会直接去访问DB,导致DB的压力瞬间变大而卡死或者宕机。

二、解决方案

  • 穿透缓存

根本原因(结合上文)就是:请求根本不存在的资源
例如:客户端发送大量的不可响应的请求
当大量的客户端发出数据库中不存在的的请求,就可能导致出现缓存穿透的情况。因为数据库DB中本身就没有该数据,所以Redis也没有对应的数据,那么这些请求在redis就得不到响应,就会直接打在DB上,导致DB压力过大而卡死情景在线或宕机

  • 解决方案

1.对空值进行缓存
类似于上面的例子,虽然数据库中没有id=-1234的用户的数据,但是在redis中对他进行缓存(key=-1234,value=null),这样当请求到达redis的时候就会直接返回一个null的值给客户端,避免了大量无法访问的数据直接打在DB上。
2.实时监控
对redis进行实时监控,当发现redis中的命中率下降的时候进行原因的排查,配合运维人员对访问对象和访问数据进行分析查询,从而进行黑名单的设置限制服务。
3.使用Boolean过滤器
使用BitMap作为布隆过滤器,将目前所有可以访问到的资源通过简单的映射关系放入到布隆过滤器中(哈希计算),当一个请求来临的时候先进行布隆过滤器的判断,如果有那么才进行放行,否则就直接拦截。
4.接口校验
类似于用户权限的拦截,对于id=-1234这些无效访问就直接拦截,不允许这些请求到达Redis、DB上。

  • 缓存雪崩

产生的原因:redis中大量的key集体过期
比如:当redis中的大量key集体过期,可以理解为redis中的大部分数据都被清空了(失效了),那么这时候如果有大量并发的请求来到,那么redis就无法进行有效的响应(命中率急剧下降),请求就都打到DB上了,到时DB直接崩溃。

  • 解决方案
  1. 使用互斥锁(Mutex Lock)或分布式锁,只允许一个请求去访问后端数据源,其他请求等待并共享结果。
  2. 将失效时间分散开, 通过使用自动生成随机数使得key的过期时间是随机的,防止集体过期
  3. 使用多级架构,使用nginx缓存+redis缓存+其他缓存,不同层使用不同的缓存,可靠性更强
  4. 设置缓存标记,记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际的key
  5. 设置热点数据的永远不过期或过期时间较长,以减少热点数据失效的机会。
  • 缓存击穿

产生的原因:redis中的某个热点key过期,但是此时有大量的用户访问该过期key。
比如:类似于“刘某某今日结婚”上了热搜,这时候大量的“粉丝”都在访问该热点事件,但是可能由于某种原因,redis的这个热点key过期了,那么这时候大量高并发对于该key的请求就得不到redis的响应,那么就会将请求直接打在DB服务器上,导致整个DB瘫痪。

  • 解决方案
  1. 为缓存数据设置不同的过期时间,使其在不同时间点过期,避免集中失效。监控数据,适时调整,监控哪些数据是热门数据,实时的调整key的过期时长
  2. 引入两级缓存架构,例如使用本地缓存(如Guava Cache)作为第一级缓存,并设置较短的过期时间,Redis作为第二级缓存,并设置较长的过期时间。
  3. 针对热点数据,可以提前进行预加载,保证其缓存不会在同一时间全部失效。

标签:缓存,请求,过期,redis,DB,击穿,雪崩,key
From: https://www.cnblogs.com/w-ll/p/18514612

相关文章

  • Redis高级部分(集群,发布订阅)
    Redis高级部分:集群、发布订阅机制详解Redis主从复制1.主从复制概念主从复制架构主要用于数据的冗余备份,从节点仅用于同步数据。它无法自动处理主节点故障转移。2.主从复制架构图3.搭建主从复制步骤3.1准备环境3.2配置文件拷贝源码中的redis.conf到每个目录,并修改......
  • redis集群
    一、集群Redis在3.0后开始支持Cluster(模式)模式,目前redis的集群支持节点的自动发现,支持slave-master选举和容错,支持在线分片(shardingshard)等特性二、集群架构图三、细节所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.节点的fail是......
  • token+redis使用
    在现代Web应用中,Token与Redis的结合使用已成为一种常见的身份验证和授权机制。Token的作用:会话跟踪,每次客户端携带token访问服务器,服务器端校验token的正确性。    好处:灵活的过期策略:Redis可以设置Token的过期时间,一旦过期,系统需要重新验证用户身份。通过合理地设......
  • redis主从复制与哨兵机制
    一、主从复制1、主从复制主从复制架构用来备份主节点的数据,主节点接受用户请求,从节点同步数据2、架构图3、搭建主从复制创建三个目录代表三台机器,master-7000,slave-7001,slave-7002拷贝源码中的redis.conf分别到master-7000,slave-7001,slave-7002中修改三台机器......
  • Windows将Redis安装为服务
    一、下载RedisWindows版Redis下载地址:https://github.com/MicrosoftArchive/redis/releases注:这是微软官方维护的将Redis移植到Windows平台,可能会落后于官方Redis的版本这里使用免安装版Redis官方下载地址(Linux/Unix版):https://redis.io/download二、安装服务......
  • jedis和redis的区别
    Jedis和Redis是在数据库和应用开发中常见的术语,它们在功能和应用上有显著的差异。本文将深入探讨Jedis和Redis之间的主要区别,包括:1.基本概念和作用;2.实现机制和使用方法;3.性能和效率;4.应用场景和适用性;5.社区支持和资源;6.安全性和可靠性;7.技术发展和行业趋势。理解这些差异对于选......
  • Redis单机&主从&哨兵&集群模式下,spring框架的使用
    Redis在单机、主从、哨兵、集群模式下,通过spring-boot-starter-data-redis如何使用。单机添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependenc......
  • 程序员必看!Redis服务器被攻击后该如何安全加固?这些方法你一定要知道!网络安全零基础入
    前言这是晓晓给粉丝盆友们整理的网络安全渗透测试入门阶段Redis未授权访问漏洞的教程喜欢的朋友们,记得给我点赞支持和收藏一下,关注我,学习黑客技术。Redis安全漏洞影响:1、Redis因配置不当可以未授权访问,很容易被攻击者恶意利用。如果Redis以root身份运行,黑客可以给root......
  • 2024年最新互联网大厂精选 Java 面试真题集锦(JVM、多线程、MQ、MyBatis、MySQL、Redis
    前言春招,秋招,社招,我们Java程序员的面试之路,是挺难的,过了HR,还得被技术面,在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能够入职一个独角兽公司,安稳从事喜欢的工作至今...近期也算是抽取出大部分休息的时间,为大家准备了一份通往大厂面试的小捷径,准备......
  • redis高级篇之IO多路复用select方法简介 第174节答疑
    1、bitmap最大1024位,一个进程最多只能处理1024个客户端2、&rset不可重用,每次socket有数据就相应的位会被置位3、文件描述符数组拷贝到了内核态(只不过无系统调用切换上下文的开销。(内核层可优化为异步事件通知)),仍然有开销。select调用需要传入fd数组,需要拷贝一份到内核,高......