redis缓存击穿,缓存雪崩,缓存穿透处理
1.缓存击穿
描述:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:
设置热点数据永远不过期,修改时set数据(不建议,业务变动会产生许多没用的缓存key,后期不好维护)
用锁使线程排队重建缓存(高并发线程排队,第一条进重建好缓存,后面直接用缓存数据)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | var key = "key" ; var value = RedisHelper.Get(key); if (value == null ) { lock (Lock) //(key) 或者用key做锁对象,不同key可以并发处理,也可以用redis分布式锁 { var data = RedisHelper.Get(key); if (data != null ) { //排队后面的线程取缓存数据 return ; } data = "数据库获取数据" ; RedisHelper.Set(key, data, TimeSpan.FromMinutes(30)); } } else { //直接取缓存 } |
2.缓存雪崩
描述:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是同一批缓存数据同时过期
解决方案:
设置热点数据永远不过期,修改时set数据(不建议,业务变动会产生许多没用的缓存key,后期不好维护)
设置随机过期时间,使重建缓存分布不同时间处理
1 | RedisHelper.Set(key, data, RedisHelper.RandomExpired(100, 1000)); |
3.缓存穿透
描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如(恶意攻击或特定业务)发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
查询或接口层处理过滤恶意攻击情况,参数校验
redis缓存null对象,设置30s左右的缓存时间
1 2 3 4 5 6 | var data = "数据库获取数据" ; if (data == null ) { RedisHelper.Set(key, null , TimeSpan.FromSeconds(30)); } RedisHelper.Set(key, data, RedisHelper.RandomExpired(100, 1000)); |
1 | <br><br><br><br> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构