ASP.Net Core -- 缓存

时间:2020-09-08 03:14:03 来源:

【摘要】 ASP.Net Core -- 缓存考必过小编为大家整理了关于ASP.Net Core -- 缓存的信息,希望可以帮助到大家!

ASP.Net Core -- 缓存

标签:reason视图bspsof回调intern企业stickyserver

缓存的优点有很多,比如:提高网站的访问速度,适用于不易改变的数据,当然也有缺点,使用缓存之前需要仔细规划这个项目,不然容易引起一些奇怪的副作用

缓存地点

1:服务器

比如是一个单服务器的web应用,缓存就可以放到这个服务器上,就是和web服务器放在一起

2:缓存服务器

如果web应用涉及到多个服务器的话,这个时候可以考虑单做做一个缓存服务器,然后其它的web服务器都可以访问这个缓存服务器

3:客户端

也就是本地

In-Memory缓存

1:这是最简单的,它实现了InMemoryCache这个接口

2:它适用于Sticky session这样的会话,翻译成中文就是黏性的会话,比如web应用涉及到多个服务器,那么就要保证,你的请求之前是访问的那一台服务器,那么之后想访问缓存数据的话,就必须访问的还是那一台服务器

3:最后,由于In-Memory使用的内存缓存,所以适用于任何类型的对象

代码示例

添加缓存服务,在startup.cs的ConfigureServices()方法中添加:

services.AddMemoryCache();

这样就可以使用In-Memory这个缓存了,比如要在HomeController里使用,只需要将InMemoryCache这个服务注入即可:

private readonly ILogger<HomeController> _logger;
        private readonly IMemoryCache _memoryCache;

        pubpc HomeController(ILogger<HomeController> logger,
            IMemoryCache memoryCache)
        {
            _logger = logger;
            _memoryCache = memoryCache;
        }

另外,我们还需要给缓存设置一些东西,比如:

1:缓存时间,

绝对过期时间::Absolute expiration time,比如一天

Spding expiration time:这个不知道怎么翻译,比如当访问到某个缓存后,把该缓存的时间时间再往后调一个小时

2:缓存的优先级

3:PostEvictionDelegate:当缓存的数据被清除后将被调用

再新建一个类,存放一个常量,因为缓存需要一个Key,如下:

pubpc class CacheEntryConstants
    {
        pubpc const string AlbumsOfToday = nameof(AlbumsOfToday);
    }

然后在控制器中在Index里,把用户列表数据进行缓存

pubpc IActionRespt Index() 
        {
            if (!_memoryCache.TryGetValue(
                CacheEntryConstants.AlbumsOfToday,
                out IEnumerable<Student> cachedStudent))
            {
                cachedStudent =  _repository.GetAll();

                var cacheEntryOptions = new MemoryCacheEntryOptions()
                    // .SetAbsoluteExpiration(TimeSpan.FromSeconds(600))
                    .SetSpdingExpiration(TimeSpan.FromSeconds(30));

                cacheEntryOptions.RegisterPostEvictionCallback(FillCache, this);

                _memoryCache.Set(CacheEntryConstants.AlbumsOfToday, cachedStudent, cacheEntryOptions);
            }


            return View(cachedStudent);
        }

然后写一个当缓存被清除后被调用的函数:

private void FillCache(object key, object value, EvictionReason reason, object state)
        {
            
        }

这里边就不写东西了,主要是用来测试,当缓存被清除后,会不会走这里边

打断点调试:

第一次,没有缓存,进入判断里边:

第二次,直接返回视图:

等待30秒,再刷新页面,进入回调函数:

具体内容:

1:先判断缓存里是否有数据,有的话直接用,没有的话就去数据库读取:

2:然后设置缓存时间

3:当缓存被清除后进入回调函数

关于In-Memory就简单学习到这里,如果以后需要可以具体看官方文档

Cache Tag Helper

既然是Helper,就是用在Razor View里边,基本格式如下:

<cache>@await Component.InvokeAsync("xxx")</cache>

当然,里边也可以添加一些属性,所以它也是在服务器端进行操作的,实际上它使用的还是内存里的缓存

Tag Helper的属性比较多,这里介绍一些相对重要的,如下:

enabled: 是否启用
expires-on: 绝对过期时间
expires-after: 时间长度
expires-spding: 可调式过期时间
vary-by-header
vary-by-query
vary-by-route
vary-by-cookie
vary-by-user
vary-by priority

具体可以看文档

代码示例

在layout.cshtml里写入:

<cache expires-after="@TimeSpan.FromSeconds(30)">
         @await Component.InvokeAsync("InternetStatus")
 </cache>

这没啥功能,就是测试网络是否连接正常,如下:

pubpc async Task<IViewComponentRespt> InvokeAsync()
        {
            var httpCpent = new HttpCpent();

            var response = await httpCpent.GetAsync("https://www.baidu.com");
            if (response.StatusCode == HttpStatusCode.OK)
            {
                return View(true);
            }

            return View(false);
        }

可以在layout里对加入哪一行代码打断点

1:第一次走进来,没问题

2:然后把电脑网络连接关闭,再刷新,还是没问题

3:等30秒后,就抛出异常了,因为缓存没了

分布式 缓存

以上的例子,因为用的是单个服务器,所以只对那一个服务器起作用,但是我们在实际企业项目开发时候,可能要做个集群什么的,比如,当用户发出请求后有多个web服务器,这个时候请求不一定请求的是那一台web服务器,所以这个时候我们就要把缓存数据提出来,单独放在一台缓存服务器上,来供其它web服务器来访问,如下:

分布式缓存的一些特点:

1:无需Sticky Session

2:可扩展

3:服务器重启不会影响缓存

4:性能更好

分布式缓存接口名和一些方法:

1:IDistributedCache

2:Get,GetAsnyc

3:Set,SetAsync

4:Refresh,RefreshAsync

5:Remove,RemoveAsync

方法的参数类型都是byte数组类型

分布式缓存默认使用一下几种:

1:分布式 Memory Cache 这个只在开发时候使用,不太分布式

2:分布式 SQL server Cache 可以在生产环境使用

3:分布式 Redis Chche 可以在生产环境使用(使用最多)

ASP.Net Core -- 缓存

标签:reason视图bspsof回调intern企业stickyserver

以上就是ASP.Net Core -- 缓存的内容,更多资讯请及时关注考必过网站,最新消息小编会第一时间发布,大家考试加油!

上一篇      下一篇
前端相关推荐 更多>>
ASP.NET MVC 表单提交多层子级实体集合数据到控制器中 ASP.Net Core 发布后,静态资源访问不了 asp.net core 3.1 自定义中间件实现jwt token认证 asp.net 高级应用 特性Attribute ( 声明,原理,扩展,AOP) Devexpress aspxgridview oncustomcallback 无刷新更新数据 Mataasploit 常见问题 device-aspect-ratio与aspect-ratio单屏布局 wsl 2 unbuntu 部署 asp.net core 使用 nginx 做
前端热点专题 更多>>
热点问答
国家公务员考试年龄限制是多少 公务员国考和省考考试内容有什么区别 函授大专学历能不能考公务员 国家公务员考试考点能自己选择吗 新闻学专业能报考2022年公务员考试吗 什么是联合培养研究生 什么是破格录取研究生 什么人不适合读研 研究生报名户口所在地填什么 研究生结业和毕业有什么区别
网站首页 网站地图 返回顶部
考必过移动版 https://m.kaobiguo.net