redis缓存穿透,击穿,雪崩总结
1、穿透
频繁访问redis和数据库中没有的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
①接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
②从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
③布隆过滤器,布隆过滤器底层使用bit数组存储数据,该数组中的元素默认值是0。
布隆过滤器第一次初始化的时候,会把数据库中所有已存在的key,经过一些列的hash算法(比如:三次hash算法)计算,每个key都会计算出多个位置,然后把这些位置上的元素值设置成1。
使用布隆过滤器确实可以解决缓存穿透问题,但同时也带来了两个问题:
存在误判的情况。
存在数据更新问题。
2、击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:
①、设置热点数据永远不过期,过期时间分散。
②、加互斥锁:redis分布式锁或者,ReentrantLock。获取锁,查询数据库,设置缓存,释放锁。
③、定时任务,过期前进行续期。定时任务时间间隔小于缓存过期时间。
3、雪崩
多个击穿,造成数据库压力过大,甚至当机。
解决方案
①、设置热点数据永远不过期,过期时间分散。
②、加互斥锁:redis分布式锁或者,ReentrantLock。获取锁,查询数据库,设置缓存,释放锁。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)