redis缓存击穿,缓存雪崩,缓存穿透处理

1.缓存击穿

描述:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

解决方案:

设置热点数据永远不过期,修改时set数据(不建议,业务变动会产生许多没用的缓存key,后期不好维护)

用锁使线程排队重建缓存(高并发线程排队,第一条进重建好缓存,后面直接用缓存数据)

       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,后期不好维护)

设置随机过期时间,使重建缓存分布不同时间处理

RedisHelper.Set(key, data, RedisHelper.RandomExpired(100, 1000));

  

3.缓存穿透

描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如(恶意攻击或特定业务)发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:

查询或接口层处理过滤恶意攻击情况,参数校验

redis缓存null对象,设置30s左右的缓存时间

                  var data = "数据库获取数据";
                    if (data == null)
                    {
                        RedisHelper.Set(key, null, TimeSpan.FromSeconds(30));
                    }
                    RedisHelper.Set(key, data, RedisHelper.RandomExpired(100, 1000));                    

  





posted @ 2022-03-01 14:31  哈喽哈喽1  阅读(62)  评论(0)    收藏  举报