缓存穿透和缓存雪崩
缓存穿透问题
string cacheKey = "Book" + id;//缓存键
Book? b = memoryCache.Get<Book?>(cacheKey);
if (b == null)//如果缓存中没有数据
{
//查询数据库,然后写入缓存
b = await ctx.Set<Book>().FindAsync(id);
memoryCache.Set(cacheKey, b);
}
使用IMemoryCache接口中的Get和Set设置缓存时,首先从缓存中查询是否有缓存键对应的缓存内容,如果没有,则去数据库查,并把查询结果写入缓存
对于大部分正常请求,客户端都会将信息保存到缓存中,后续从缓存读取,数据库压力小;但是针对在数据库不存在的数据,缓存中不会保存任何信息,如果恶意访问使用不存在id来发送大量请求,数据库压力大,可能会导致崩溃,这就叫缓存穿透。
解决办法
把“查不到”也当成一个数据放入缓存。
我们用GetOrCreateAsync方法即可,因为它会把null值也当成合法的缓存值。
缓存雪崩
缓存项集中过期引起缓存雪崩。
解决方法
在基础过期时间之上,再加一个随机的过期时间。
e.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(Random.Shared.Next(10, 15));//过期时间随机10-15