ASP.NET Core中的缓存


内存缓存
1、把缓存数据放到应用程序的内存。内存缓存中保存的是一系列的键值对,就像Dictionary类型一样

2、内存缓存的数据保存在当前运行的网站程序的内存中,是和进程相关的。因为在Web服务器中,多个不同网站时运行在不同的进程中的,因此不同网站的内存缓存是不会互相干扰的,而且网站重启后,内存缓存的所有数据也就都被清空了


内存缓存用法
1、启用:builder.Services.AddMemoryCache()
2、注入IMemoryCache接口,查看接口的方法:TryGetValue、Remove、Set、GetOrCreate、GetOrCreateAsync

缓存的过期时间
1、解决方法:在数据改变的时候调用Remove或者Set来删除或者修改缓存(优点:及时);过期时间(只要过期时间比较短,缓存数据不一致的情况也不会持续很长时间)
2、两种过期时间策略:绝对过期时间、滑动过期时间

--缓存的绝对过期时间
1、GetOrCreateAsync()方法的回调方法中有一个ICacheEntry类型的参数,通过ICacheEntry对当前的缓存项做设置

2、AbsoluteExpirationRelativeToNow用来设定缓存项的绝对过期时间

测试案例:
Book? b = await memoryCache.GetOrCreateAsync("Book" + id, async (e) =>
{
    //缓存有效期10秒
    e.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10);
    return await MyDbContext.GetByIDAsync(id);
});


--缓存的滑动过期时间
ICacheEntry的SlidingExpiration属性用来设定缓存项的滑动过期时间
只要在缓存没过期的时候发送请求,缓存自动续命一段时间

测试案例:
Book? b = await memoryCache.GetOrCreateAsync("Book" + id, async (e) =>
{
    e.SlidingExpiration = TimeSpan.FromSeconds(10);
    return await MyDbContext.GetByIDAsync(id);
});

两种过期时间混用
使用滑动过期时间策略,如果一个缓存项一直被频繁访问,那么这个缓存项就会一直被续期而不过期。可以对一个缓存项同时设定滑动过期时间和绝对过期时间,并且把绝对过期时间设定的比滑动过期时间长,这样缓存项的内容会在绝对过期时间内随着访问被滑动续期,但是一旦超过了绝对过期时间,缓存项就会被删除。


缓存穿透
string cacheKey = "Book" + id;    //缓存键
Book? b = memoryCache.Get<Book?>(cacheKey);
if(b == null)    //如果缓存中没有数据
{
    //查询数据库,然后写入缓存
    b = await dbCtx.Books.FindAsync(id);
    memoryCache.Set(cacheKey,b);
}

因为id在数据库中不存在相应的数据,每次查询的时候,缓存中是没有数据的,缓存不生效,所以每次都要去数据库中进行查询

1、解决方法:把"查不到"也当成一个数据放入缓存
2、使用GetOrCreateAsync方法即可,因为它会把null值也当场合法的缓存值


缓存雪崩
1、缓存项集中过期引起缓存雪崩
2、解决方法:在基础过期时间之上,再加一个随机的过期时间

缓存数据混乱
解决方法:合理设置Key
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值