ASP.NET Core缓存穿透和缓存雪崩

缓存穿透问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值