第十三节:视图缓存、缓存标记、响应压缩

一. 视图缓存

1.对比与区别

  Core中的ResponseCache和老版MVC中的OutputCache定位不一样,OutputCache是缓存在服务器内存中的,所以你给一个视图加上标签, 不管几个客户端(浏览器)访问,只有第一个进方法内,在缓存的有效时间里其他客户端都是从缓存中访问,不进实际方法。

  而Core中的ResponseCache,是存储在浏览器里的,在同一个浏览器,当用多个标签打开页面,只有第一个标签进方法内,其他标签均不进方法,从本地缓存中拿值,但是手动刷新页面、地址栏回车、换个浏览器访问 均相当一次新的请求,是要进服务器方法的,重新获取

个人观点:Core中的ResponseCache用户不大,很少有场景会使用它。

2.  分享一下代码

复制代码
 1         [ResponseCache(Duration = 600)]
 2         //[ResponseCache(VaryByHeader = "User-Agent", Duration = 5)]
 3         //[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
 4         //[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Client, NoStore = false)]
 5         //[ResponseCache(CacheProfileName = "test1")]
 6         public IActionResult Index()
 7         {
 8             //Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.CacheControl] = "public, max-age=600";
 9 
10             //Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
11             //{
12             //    Public = true,
13             //    MaxAge = TimeSpan.FromSeconds(600)
14             //};
15 
16             ViewBag.t1 = DateTime.Now.ToString();
17             return View();
18         }
复制代码

 

二. 缓存标记

1. 说明

  分为内存缓存和分布式缓存,内存缓存用<cache></cache>标签,分布式缓存用<distributed-cache></distributed-cache>标签,但分布式缓存必须要有一个name属性, name 是必需的,name 属性用作每个存储的缓存实例的键。 分布式缓存标记帮助程序分配缓存键时只以属性 name 上的键为基础,这点与内存缓存标记帮助程序不同, 内存缓存的标记程序基于 Razor 页面中的 Razor 页面名称和位置为每个实例分配缓存键。

注:缓存标记程序不需要在ConfigureService中注册。

2. 二者相关属性是一样的

 (1) enabled:确定是否启用,省略的话默认为true

 (2) expires-on: 为缓存项设置一个绝对到期日期,如:<cache expires-on="@new DateTime(2019,7,17,12,02,0)"> 2019年7月17 12点02分过期

 (3) expires-after:通过间隔的形式设置绝对过期时间,如: <cache expires-after="@TimeSpan.FromSeconds(2)">

 (4) expires-sliding:设置滑动过期时间

 (5) vary-by-header:接受逗号分隔的标头值列表,在标头值发生更改时触发缓存刷新,如User-Agent,每个浏览器不同

 (6) vary-by-query:vary-by-query 接受查询字符串(Query) 中逗号分隔的 Keys 列表,它们在任何列出的键值发生更改时触发缓存刷新。

 (7) vary-by-route: 接受路由参数名称的逗号分隔列表,用于在路由数据参数值发生更改时触发缓存刷新。

 (8) vary-by-cookie:接受 Cookie 名称的逗号分隔列表,用于在 Cookie 值发生更改时触发缓存刷新。

 (9) vary-by-user:指定当已登录用户(或上下文主体)发生更改时是否应重置缓存

 (10) vary-by:允许自定义缓存的数据。 当属性的字符串值引用的对象发生更改时,会更新缓存标记帮助程序的内容

 (11) priority:设置移除级别

 代码分享:

复制代码
 1   <h4>下面是缓存标记程序</h4>
 2     <p>
 3         <cache enabled="true">
 4             Current Time Inside Cache Tag Helper: @DateTime.Now
 5         </cache>
 6     </p>
 7     <p>
 8         <cache expires-on="@new DateTime(2019,7,17,12,02,0)">
 9             Current Time Inside Cache Tag Helper: @DateTime.Now
10         </cache>
11     </p>
12     <p>
13         <cache expires-after="@TimeSpan.FromSeconds(2)">
14             Current Time Inside Cache Tag Helper: @DateTime.Now
15         </cache>
16     </p>
17     <p>
18         <cache expires-sliding="@TimeSpan.FromSeconds(60)">
19             Current Time Inside Cache Tag Helper: @DateTime.Now
20         </cache>
21     </p>
22     <p>
23         <cache vary-by-header="User-Agent">
24             Current Time Inside Cache Tag Helper: @DateTime.Now
25         </cache>
26     </p>
27     <p>
28         <cache vary-by-query="Make,Model">
29             Current Time Inside Cache Tag Helper: @DateTime.Now
30         </cache>
31     </p>
32     <p>
33         <cache vary-by-route="Make,Model">
34             Current Time Inside Cache Tag Helper: @DateTime.Now
35         </cache>
36     </p>
37     <p>
38         <cache vary-by-cookie=".AspNetCore.Identity.Application">
39             Current Time Inside Cache Tag Helper: @DateTime.Now
40         </cache>
41     </p>
复制代码

三. 响应压缩

 1. 在ConfigureService中注入下面代码:

复制代码
 1             //响应压缩的配置
 2             services.AddResponseCompression(options =>
 3             {
 4                 //options.Providers.Add<BrotliCompressionProvider>();
 5                 //options.Providers.Add<GzipCompressionProvider>();
 6                 //自己定义一个压缩
 7                 options.Providers.Add<CustomCompressionProvider>();
 8                 options.MimeTypes =
 9                     ResponseCompressionDefaults.MimeTypes.Concat(
10                         new[] { "image/svg+xml" });
11             });
12 
13             services.Configure<GzipCompressionProviderOptions>(options =>
14             {
15                 options.Level = CompressionLevel.Fastest;
16             });
复制代码

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @   Yaopengfei  阅读(952)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2018-07-10 第三节:SignalR之PersistentConnection模型详解(步骤、用法、分组、跨域、第三方调用)
2017-07-10 第一节:MySQL5.7的安装(win、linux、docker)
点击右上角即可分享
微信分享提示