情不知从何起,一往而情深
排名
6
文章
199
粉丝
4
评论
3
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

缓存击穿、穿透、雪崩及常用解决方案

6401人阅读 2023/5/30 15:15 总访问:1181517 评论:0 收藏:0 手机
分类: redis

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

Redis是一种高性能的键值型数据库,它可以用来实现缓存功能,提高应用的响应速度和承载能力。但是,使用Redis缓存也会遇到一些常见的问题,比如缓存击穿、缓存穿透、缓存雪崩。这些问题都会影响缓存的效率和稳定性,所以需要了解它们的原因和解决方案,保障Redis能够正常运行。

击穿、穿透、雪崩的意思

击穿、穿透、雪崩这三个词语很容易混淆,本文先对词语进行理解,再讲解技术
击穿:击穿拆开后,是击和穿。击意为敲打,或做类似敲打的动作穿意为穿透
击是什么?如下图,攻击的意思

穿是什么?如下图,穿透,造成的效果就是个

雪崩的意思很简单,就是一个字,如下图

白话讲解一下,击穿就是先击后穿;穿透就是穿透,有个洞;雪崩就是多,很多很多
再从技术角度说明击穿、穿透、雪崩

击穿意为先击后穿。热点数据存在,且能够击中。但是由于热点数据失效从而访问数据库
穿透意为直接穿。由于访问不存在的数据,从而直接访问数据库
雪崩意为多,大量。大量缓存同时失效,从而直接访问数据库

缓存击穿

缓存击穿的定义:某个热点数据在缓存中过期或失效时,大量的请求同时访问该数据,导致数据库压力过大甚至崩溃的现象。通常会发生在数据更新频率较高或者缓存设置了相同的过期时间的时候。
实际上可以这么理解:应该有的数据但是没读到,从而击穿了缓存,直接访问数据库
可采取的方案:

  • 不设置过期时间或设置较长的过期时间:这样可以避免热点数据同时失效,但是也会增加内存占用和数据不一致的风险
  • 定时更新。比如这个热点数据的过期时间是 2 小时,那么每到 1小时50 分钟时,通过定时任务去更新这个热点 key,并重新设置其过期时间
  • 互斥锁:当缓存中没有数据时,只允许一个线程去数据库查询并更新缓存,其他线程等待该线程完成后再从缓存中获取数据。这样可以减少对数据库的并发访问,但是也会降低系统的吞吐量和响应速度
  • 分布式锁:当多个Redis节点存在时,可以使用分布式锁来保证只有一个节点去数据库查询并更新缓存,其他 节点等待该节点完成后再从缓存中获取数据。这样可以避免多个Redis节点同时访问数据库,但是也会增加系统的 复杂度和延迟

缓存穿透

缓存穿透的定义:
用户查询一个不存在的数据,导致缓存中没有该数据,每次都要去数据库查询,而数据库中也没有该数据,造成无效的查询和资源浪费的现象。通常会发生在用户恶意攻击或者参数校验不严格的时候
实际上可以这么理解:不应该有的数据非要读,从而穿透了缓存,直接访问数据库
可采取的方案:

  • 业务层校验。用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。比如请求参数为主键自增 id ,那么对于请求小于 0 的 id 参数, 明显不符合业务逻辑。
  • 缓存空值:当数据库中没有查询到数据时,仍然将空值或者默认值写入缓存,并设置一个较短的过期时间。这样可以减少对数据库的访问次数,但也会占用一定的内存
  • 使用布隆过滤器:布隆过滤器是一种概率型的数据结构,它可以判断一个元素是否可能存在于一个集合中。可以将所有可能存在的数据的键值哈希到一个足够大的位图中,当用户查询一个数据时,先用布隆过滤器判断该键值是否可能存在,如果不存在则直接返回,如果存在则再去缓存和数据库中查询。这样可以有效地拦截不存在的数据请求,但是也会有一定的误判率和内存开销

缓存雪崩

缓存雪崩的定义:在某个时间点,大量的缓存数据同时失效或者缓存服务器宕机,导致所有的请求都要去数据库查询,造成数据库压力过大甚至崩溃的现象。这种情况通常发生在缓存设置了相同或者相近的过期时间或者缓存服务器遭遇意外故障的场景下。
实际上可以这么理解:大量数据读取,从而使缓存雪崩,直接访问数据库
为了防止缓存雪崩,可以采用以下几种方法:

  • 设置不同的过期时间。可以给缓存设置不同或者随机的过期时间,避免大量的缓存同时失效,造成数据库压力突增
  • 缓存预热:对于即将来临的大量请求,可以将数据提前缓存在Redis中,并设置不同的过期时间
  • 使用多级缓存:可以构建多级缓存架构,比如Nginx缓存+Redis缓存+本地缓存等,当某一级缓存出现问题时,可以从其他级别的缓存中获取数据,增加系统的容错能力
  • 使用限流熔断:可以利用一些限流和熔断组件,对请求进行限流和降级处理,当请求超过系统能承受的阀值时,直接拒绝或者返回默认值,保护数据库不被打垮
  • 使用集群和负载均衡:可以将Redis部署成集群模式,并使用负载均衡组件,比如LVS、HAProxy等,对请求进 行分发和转发,提高Redis的可用性和并发能力

总结

本文介绍了缓存击穿、缓存穿透和缓存雪崩三种问题及解决方案。通过本文,可以了解到:

  • 缓存击穿:先击后穿
  • 缓存击穿的解决方案有:设置热点数据永不过期、定时更新、分布式
  • 缓存穿透:将缓存穿了个洞
  • 缓存穿透的解决方案有:业务层校验、缓存空值、布隆过滤器
  • 缓存雪崩:大量失效Key
  • 缓存雪崩的解决方案有:设置不同的过期时间、缓存预热、多级缓存、限流熔断、集群和负载均衡
    • 1 缓存预热
    • 2 多级缓存
    • 3 限流熔断
    • 4 集群和负载均衡

原文:https://www.cnblogs.com/reim/p/17442637.html


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

缓存穿透缓存击穿缓存雪崩区别

一、缓存穿透 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存...

Quartz.NET实例动态改变周期调度。misfireCron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.NET Windows服务发布安装卸载监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

C ??? 问号和2个问号的用法(类型?对象?)

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

C outref关键字的用法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。out:classProgram { /* *out、ref都是引用传递,传递后使用都会改变...

cVB.net中全角半角转换方法

///<summary> ///转全角的函数(SBCcase) ///</summary> ///<paramname="input">任意字符串...

redis中主从哨兵和集群这三个有什么区别

主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。sentinel(哨兵)发现master挂了后,就会从slave中重新选举一个...

JS监听inputkeydown,有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

下划线换行回车空格ASCII码值与对照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

docker常用命令删除镜像命令进入容器docker重启命令等

1. docker version查看 Docker 版本信息2. docker info显示 Docker 系统信息,包括镜像,容器数等3. 运行容器第一次使用:d...

多线程Lock锁数据库实现队列

队列其元素以先进先出(Firstin,Firstout,FIFO)的方式来处理的集合。先放入队列中的元素会先读取。队列使用System.Collect...

jsJQuery获取文本的宽高

页面编写:<!DOCTYPEhtml> <html> <head> <metacharset="UTF-8"/> <title>jQ...

code first执行命令报错,无法将“Enable-Migrations”项识别为 cmdlet函数脚本文件

EF:执行命令报错无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如...

微服务分布式架构项目的一点点想法

分布式与微服务的区别:说一点个人理解分布式: 分散压力。 不同功能块之间的通讯少,还是会有不少代码,每一...

文件传输原理与二进制字节字符理解

传输文件原理: 把文件转换成字节数组,通过字节数组传输 然后接收方在把字节数据转换成文件二进制为什么能存储文件 ...