redis-击穿、穿透、雪崩

embedded/2024/11/23 19:07:47/

击穿、穿透、雪崩经常听人说吧? 那他到底是啥呢?无非就是在有缓存层的情况下,对各种绕过缓存层从而直接落到了DB上的情况进行的分类。

概念性的东西大概如下,我是记不住,后期具体使用与规避这些问题才是大事,后面有机会更新吧。

  1. 击穿(Cache Penetration)
    定义: 击穿是指请求的数据在缓存中永远找不到,导致请求直接落到数据库上。这种情况通常是由于某些恶意请求或者程序错误导致的,请求的 key 本身是无效的,或者根本不存在。
    原因:
    恶意请求:攻击者故意请求不存在的 key。
    程序错误:代码逻辑错误,生成了无效的 key。
    解决方案:
    布隆过滤器:使用布隆过滤器预先判断 key 是否存在,如果布隆过滤器返回不存在,则直接返回空结果,不再查询数据库
    缓存空值:对于查询不到的数据,也缓存一个空值(例如 null),并设置一个较短的过期时间,防止频繁查询数据库
    验证参数:在接口层增加校验,不合法的参数直接返回。
    黑名单:设定一个合理的阈值,当某个IP的请求次数超过阈值时,将其加入黑名单,限制其访问频率或直接拒绝其请求。
  2. 穿透(Cache Miss)
    定义: 穿透是指缓存中某个 key 失效或被删除,导致请求绕过缓存层直接访问数据库。这种情况通常是正常的缓存过期或缓存被主动删除导致的。
    原因:
    缓存过期:缓存中的数据超过了设定的过期时间。
    主动删除:缓存中的数据被主动删除,例如在更新数据库后删除缓存
    解决方案:
    缓存预热:在系统启动时或定期预热缓存,提前加载常用数据。
    异步加载:当缓存未命中时,可以异步加载数据并更新缓存,避免所有请求同时访问数据库
  3. 雪崩(Cache Avalanche)
    定义: 雪崩是指大量缓存 key 同时失效,导致大量请求同时绕过缓存层直接访问数据库,造成数据库压力剧增,甚至崩溃。这种情况通常是由于缓存过期时间设置不合理或突发的高并发请求导致的。
    原因:
    缓存过期时间集中:多个缓存 key 设置了相同的过期时间,导致同时失效。
    突发高并发:短时间内大量请求同时访问数据库
    解决方案:
    随机过期时间:为缓存 key 设置随机的过期时间,避免大量 key 同时失效。
    限流降级:在高并发情况下,使用限流和降级策略,限制请求频率,保护数据库
    缓存预热:在系统启动时或定期预热缓存,提前加载常用数据。
    多级缓存:使用多级缓存策略,例如本地缓存 + 分布式缓存,减少对数据库的直接访问。

个人理解

  • 击穿: 请求的数据在缓存里永远找不到,请求绕过缓存
  • 穿透:部分key失效或被删除,请求绕过缓存
  • 雪崩:所有缓存key同时失效,所有请求全部绕过缓存

http://www.ppmy.cn/embedded/139916.html

相关文章

Excel表查找与引用函数、逻辑函数、财务函数

一、查找与引用函数 函数说明ADDRESS返回单元格的地址CHOOSE从参数列表中选择一个值COLUMN返回单元格的列号COLUMNS返回数组中列的数量HLOOKUP在表格的首行查找值,并返回指定行的值INDEX返回表或区域中的值INDIRECT根据文本字符串返回引用LOOKUP一维查找函数MATCH返…

数据抓取与存储:将网络爬虫数据保存到数据库的详细指南

在当今信息爆炸的时代,网络爬虫已经成为获取和处理数据的重要工具。将爬取的数据保存到数据库中,不仅可以有效地组织和存储数据,还可以为后续的数据分析和处理提供便利。本文将详细介绍如何将爬取的数据保存到数据库中,包括关系型…

c++ 20 语法规范, vs2019 类 exception 的定义,在 vcruntime_exception .h

这个源头文件,在 STL 模板库里的其他模板的定义中,会引用到,因此,记录与注释一下。源代码很短,直接展开来,同时也附上资源 .h 文件: // // vcruntime_exception.h // // Copyright (c) Mi…

PyCharm的类型警告: Expected type ‘SupportsWrite[bytes]‘, got ‘BinaryIO‘ instead

记录时使用的PyCharm版本: PyCharm 2024.3 (Professional Edition) Build #PY-243.21565.199, built on November 13, 2024 问题描述 当在PyCharm里使用pickle保存文件, 比如以下代码这样: with open(meta_save_path, wb) as f:pickle.dump(meta, f)会发现PyCharm对此发出类型…

为什么芯麦的 GC4931P 可以替代A4931/Allegro 的深度对比介绍

在电机驱动芯片领域,芯麦 GC4931P 和 A4931 都是备受关注的产品。它们在多种应用场景中发挥着关键作用,今天我们就来详细对比一下这两款芯片。 一、性能参数对比 (一)电流输出能力 A4931 具有一定的电流输出能力,但芯…

JVM(五、垃圾回收器)

经典的垃圾回收器大概有7种,这些收集器的目标、特性、原理、使用场景都有所区别,有的适用于年轻代,有的适用于老年代,图中展示的就是这7中垃圾回收器,如果两个垃圾回收器有连线,则表明可以配合使用。这个关…

27、js中声明变量

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title></title> </head> <body> </body> <script> // js中声明变量用var // 变量名…

迅为RK3588开发板Android系统开发笔记允许usb调试

首先开发板烧写 Android12 系统&#xff0c;连接屏幕&#xff0c;烧写线&#xff0c;串口线&#xff0c;电源线。连接完毕后&#xff0c;接 着我们打开 usb 调试。步骤如下&#xff1a; 1.在屏幕上打开设置 app,如下图所示&#xff1a; 2 滑到最底部&#xff0c;点击“关于平…