Redis缓存穿透和缓存雪崩问题
缓存穿透
即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。解决方法:- 布隆过滤器(推荐)。内部维护一系列合法有效的key,迅速判断出请求所携带的Key是否合法有效,如果不合法,则直接返回。它不一定精确,跟哈希函数的好坏有关,当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。
- 缓存空对象。指一个请求发送过来,如果此时缓存中和数据库都不存在这个请求所要查询的相关信息,那么数据库就会返回一个空对象,并将这个空对象和请求关联起来存到缓存中,当下次还是这个请求过来的时候,这时缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。
缓存击穿
指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。解决:- 互斥锁。就是让一个线程回写缓存,其他线程等待回写缓存线程执行完,重新读缓存即可。分布式环境下可以使用分布式锁。
- 热点数据不过期。缓存在物理上永远不过期,用一个异步的线程更新缓存。
缓存雪崩
指缓存中数据大批量到过期时间,而查询数据量巨大,请求直接落到数据库上,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。解决:- 给缓存的失效时间,加上一个随机值,避免集体失效。
- 使用互斥锁,但是吞吐量会明显下降。
- 双缓存策略。主缓存:有效期按照经验值设置,设置为主读取的缓存,主缓存失效后从数据库加载最新值。备份缓存:有效期长,获取锁失败时读取的缓存,主缓存更新时需要同步更新备份缓存。
总结
图片来自:https://baijiahao.baidu.com/s?id=1681691345944318719&wfr=spider&for=pc参考:
https://baijiahao.baidu.com/s?id=1681691345944318719&wfr=spider&for=pc
https://blog.csdn.net/QiuHaoqian/article/details/109154315
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix