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>
posted @   哈喽哈喽1  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示