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));

浙公网安备 33010602011771号