首页 / 知识
Redis--缓存穿透、缓存雪崩、缓存击穿
2023-04-11 16:18:00

缓存穿透
指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。
出现原因
自身业务代码或者数据出现问题
恶意的请求会故意查询不存在的 key
解决方案
查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短;
布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对 DB 的查询。
布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
缓存雪崩
当缓存服务器重启或者设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到 DB,DB 瞬时压力过重雪崩。
出现原因
缓存服务器宕机\缓存服务器重启
大量缓存超时时间相同,在同一时间段失效(大批key失效/热点数据失效)。
解决方案
不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀。比如可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待。
采用多级缓存,本地进程作为一级缓存,redis作为二级缓存,不同级别的缓存设置的超时时间不同,即使某级缓存过期了,也有其他级别缓存兜底
缓存击穿
对于设置了过期时间的 key,缓存在某个时间点过期的时候,恰好这时间点对这个 Key 有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。
出现原因
某个热点key在某个时间点过期,恰好该时间点对这个key有大量并发的请求。
解决方案
使用互斥锁:当缓存失效时,不立即去 load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db 的操作并回设缓存,否则重试 get 缓存的方法。
永远不过期:物理不过期,但逻辑过期(后台异步线程去刷新)。
从缓存层面来看,确实没有设置过期时间,所以不会出现热点key过期后产生的问题,也就是“物理”不过期。
从功能层面来看,为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去更新缓
小结
缓存雪崩与缓存击穿的区别:缓存雪崩是针对很多key,缓存击穿是针对某一个key的缓存。
|
最新内容
相关内容
python怎么判断文档是否有指定后缀
python怎么判断文档是否有指定后缀?,培训,后缀,文档,文件夹,路径,以上,文件,方法,更多,内容,python判断文档是否有指定后缀的方法:importosYou如何在python代码中指定保存的文件
如何在python代码中指定保存的文件格式,代码,培训,文件格式,格式,二进制文件,文件,后缀,以上,方法,更多,python指定保存文件格式的方法:1、保linux可以卸载指定的python版本吗?
linux可以卸载指定的python版本吗?,软件,培训,版本,以上,方法,更多,内容,linux卸载指定python版本的方法:1、卸载python3.5(指定相应的版本python中怎么将元组、字典转化为列
python中怎么将元组、字典转化为列表,培训,列表,字典,方法,元素,示例,中将,语法,以上,参数,python中将元组、字典转化为列表的方法:python中可python如何去除数组中的指定元素
python如何去除数组中的指定元素,培训,元素,函数,除数,序列,参数,示例,语法,以上,条件,python中可以使用filter()函数来删除数组中指定元素。python找不到指定模块怎么办
python找不到指定模块怎么办,工具,培训,模块,语句,管理工具,文件夹,以上,方法,更多,内容,python的模块是通过import语句引入的,如果使用引入语pythonpython中有指针吗
pythonpython中有指针吗,入口,地址,培训,位置,标准,代码,函数,指针,对象,变量,Python对指针做了良好封装,一切都是“对象”,一切对象都有一个“python使用Redis会遇到哪些缓存问
python使用Redis会遇到哪些缓存问题?,培训,缓存,问题,python如何关闭redis
python如何关闭redis,培训,基础,管理,项目,接口,当中,说法,实际,以上,内部,python读写redis时,到底需不需要关闭redis连接池连接?importredisdpython函数、类的区别
python函数、类的区别,数据,代码,培训,公用,设计,名称,变量,函数,实例,方法,python函数、类的区别:函数是组织好的,可重复使用的,用来实现单一,或python类、模块、包的概念及区别
python类、模块、包的概念及区别,概念,数据,培训,模块,名字,环境,基础,文件,函数,定义,类类的概念在许多语言中出现,是面向对象编程的基础,很容pythonos.system执行cmd指令
pythonos.system执行cmd指令,培训,状态,高位,号码,低位,指令,脚本,内容,控制台,实例,pythonos.system执行cmd指令1、执行cmd指令,在cmd输出的