Redis-穿透、击穿、雪崩
一、Redis穿透
当使用key去查询时,缓存和数据库中都没有对应的数据和数据源,这时在缓存中获取不到去访问DB,若访问量过大容易压垮DB。
解决方法:
(1)对空值缓存:如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间很短。
(2)布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmaps中,一个一定不存在的数据会被 这个bitmaps拦截掉,从而避免了对底层存储系统的查询压力。
(3)设置白名单:使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。
二、Redis击穿
一个key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,大并发的请求可能会瞬间把后端DB压垮。
解决方法:
(1)加大热key的失效时长
(2)使用互斥锁(mutex key)
在缓存失效的时候(判断拿出来的值为空)不立刻加载DB去查找,而是先使用缓存工具的某些带成功操作返回值的操作(如:Redis中SETNX)去set一个mutex key,当操作返回成功时,再进行加载DB的操作并回设缓存;否则,就重试整个get缓存的方法。
三、Redis雪崩
雪崩与击穿的区别在于,雪崩时多个key缓存失效。
解决方法:
(1)建立多级缓存机制:nginx缓存 + redis缓存 +其他缓存(ehcache等)(2)不同的key,设置不同的过期时间,具体值可以根据业务决定,让缓存失效的时间点尽量均匀
(3)在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!