必威体育Betway必威体育官网
当前位置:首页 > IT技术

MVC输出缓存(OutputCache参数详解)

时间:2019-10-06 04:45:41来源:IT技术作者:seo实验室小编阅读:60次「手机版」
 

outputcache

原文地址:http://blog.csdn.net/kebi007/article/details/59199115

  1.学习之前你应该知道这些

几乎每个项目都会用到缓存,这是必然的。以前在学校时做的网站基本上的一个标准就是1.搞定增删改查2.页面做的不要太差3.能运行(ps真的有这种情况,答辩验收的时候几个人在讲台上演示,网站都运行不起来,混日子了o)就算完成任务。(老师可不会去问你这个页面怎么打开这么慢)。但是在实际工作中大大小小的项目都会用到缓存,这也是培训学校的一个怪像,【赶进度,从不注重基础知识的积累】。no bb 了,下面我们就来学习一下mvc中的缓存。

在学习如何使用缓存之前,潜意识里我们应该有这样三个概念

  1. 使用缓存的目的就是为提供网站性能,减轻对数据库的压力,提高访问的速度。
  2. 如果使用缓存不当,比不使用缓存造成的影响更恶劣(缓存数据的更新不及时、缓存过多等)
  3. .net MVC 中有两种相应的缓存技术 :1.应用程序缓存 。2.输出缓存

   2.MVC中应用程序缓存和输出缓存的区别

虽然我这篇文章标题是“MVC输出缓存Outputcache缓存入门学习”.但是必须知道这两者的区别。

输出缓存:也就是Outputcache 是相对于某个Action或controller而言。使用的场景包括某个页面的数据更新不是很频繁,不需要每次都从数据库区查询。缓存起来从内存中读取。比如文章详情,排名什么的。

数据缓存:是相对于全局的。任何地方需要调用的时候都可以去调用。使用的场景包括权限管理这种模块的。每个角色对于菜单的访问都是固定的,所以有必要将角色,权限,菜单这种数据做一个全局的数据缓存。修改时再做缓存的更新。

如果通俗一点来说输出缓存就像是“局部变量”,数据缓存就像是全局变量。(虽然这个比方好像不太合适,大概就是这么一个意思)。还是看看微软的介绍这两种机制吧

应用程序缓存

应用程序缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。使用应用程序缓存的优点是由 ASP.NET 管理缓存,它会在项过期、无效、或内存不足时移除缓存中的项。还可以配置应用程序缓存,以便在移除项时通知应用程序。有关更多信息,请参见缓存应用程序数据。

使用应用程序缓存的模式是,确定在访问某一项时该项是否存在于缓存中,如果存在,则使用。如果该项不存在,则可以重新创建该项,然后将其放回缓存中。这一模式可确保缓存中始终有最新的数据。

有关更多信息,请参见如何:检索缓存项的值。

页输出缓存

页输出缓存在内存中存储处理后的 ASP.NET 页的内容。这一机制允许 ASP.NET 向客户端发送页响应,而不必再次经过页处理生命周期。页输出缓存对于那些不经常更改,但需要大量处理才能创建的页特别有用。例如,如果创建大通信量的网页来显示不需要频繁更新的数据,页输出缓存则可以极大地提高该页的性能。可以分别为每个页配置页缓存,也可以在 Web.config 文件中创建缓存配置文件。利用缓存配置文件,只定义一次缓存设置就可以在多个页中使用这些设置。

页输出缓存提供了两种页缓存模型:整页缓存和部分页缓存。整页缓存允许将页的全部内容保存在内存中,并用于完成客户端请求。部分页缓存允许缓存页的部分内容,其他部分则为动态内容。有关更多信息,请参见缓存 ASP.NET 页。

部分页缓存可采用两种工作方式:控件缓存和缓存后替换。控件缓存有时也称为分段缓存,这种方式允许将信息包含在一个用户控件内,然后将该用户控件标记为可缓存的,以此来缓存页输出的部分内容。这一方式可缓存页中的特定内容,并不缓存整个页,因此每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。

缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,如果要创建一个在规定时间段内为静态的页,则可以将整个页设置为进行缓存。如果向页添加一个显示用户名的 Label 控件,则对于每次页刷新和每个用户而言,Label 的内容都将保持不变,始终显示缓存该页之前请求该页的用户的姓名。但是,使用缓存后替换机制,可以将页配置为进行缓存,但将页的个别部分标记为不可缓存。在此情况下,可以向不可缓存部分添加 Label 控件,这样将为每个用户和每次页请求动态创建这些控件。有关更多信息,请参见缓存 ASP.NET 页的某些部分。

  3.MVC如何使用输出缓存

通过这篇文章你将学习到在MVC中如何使用输出缓存,业务逻辑我就不多介绍了,主要是Outputcache的基本使用。至于数据缓存还是等我的下一篇文章吧,一步一步来不急的。

输出缓存的使用方法是在Controller 或Action上打[OutPutCache]特性即可。我这里以Action为示例


 
  1. [OutputCache(Duration =20)]//设置过期时间为20秒

  2. public ActionResult exampleCache()

  3. {

  4. var timeStr =DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");

  5. ViewBag.timeStr = timeStr;

  6. return View();

  7. }

我们在页面上可以很明显地看到:

在20秒时间差距内页面上的时间都不会被改变。他在response Header中过期时间和上次修改的时间正好相隔20秒。Http StatusCode 304 这个我得简单介绍下,这个页面是缓存在客户端浏览器的,服务器在接收响应时(还没有超过20秒)并没有返回给浏览器一个新的html文档,只是告诉浏览器 No Modified,从本地去读取即可。当然有必要去了解一下304 ,介绍看看这篇文章http状态码304的介绍

在Controller上加OutputCache特性时,Controller下的所有的Action都将实现此特性。如果同时Action也有此特性时,以Action为标准,Action的粒度更精细。

Outputcache特性中可以加上一些参数,主要有这些

Outputcache重要的参数
int Durrtion 获取或设置缓存持续时间(以秒为单位)
bool NoStore 是否存储缓存,默认是false,当为true时http状态码就会变成200
string VaryByParam  获取或设置参数变化的值。不同的参数都会被缓存不同的文档,多个参数用逗号隔开,none、*(空、所有)
string Cacheprofile 获取或设置缓存配置文件名称,也就是说在配置文件中设置缓存
string VaryByCustom 获取或设置基于自定义项变化的值,自定义任何输出缓存的文字,比较常用
 Location 枚举值 None不缓存,Server缓存在服务器端,Client缓存在浏览器,Any在浏览器、代理服务器、web服务器
string sqlDependency 获取或设置 SQL 依赖项,根据数据库的变化更新缓存
   

对于这些参数如何使用我就写几个例子,看看效果吧。

4.输出缓存CacheProfile使用配置文件设置缓存

这种方式便于统一配置,当然也可以设置参数duration、location 、varybyparam等。我们需要在system.web 节点下加入这些


 
  1. <!---CacheProfile配置文件中设置缓存-->

  2. <caching>

  3. <outputCachesettings>

  4. <outputCacheProfiles>

  5. <add name="exampleCacheProfile" duration="20" location="Any" enabled="true"/>

  6. </outputCacheProfiles>

  7. </outputCacheSettings>

  8. </caching>

  9. <!---CacheProfile配置文件中设置缓存end-->

其实作用和效果还是一样,无非就是方便点,统一的配置参数都直接写webconfig文件里面。当然你也可以在Controller中写。看效果吧

5.输出缓存VarByParam参数的使用

简单点来说就是根据不同的参数值生成缓存。代码是这样的


 
  1. [OutputCache(Duration =20,VaryByParam ="type,page")]

  2. public ActionResult ExampleVaryByParam(string type,int page)

  3. {

  4. ViewBag.type = type;

  5. ViewBag.page= page;

  6. return View();

  7. }

通过页面上可以观察到,这是不符合缓存数据的更新的,在缓存持续的时间内,改变了参数值,但是Action并没有重新生成页面返回,但是浏览器的Http Status Code

还是200 ,所以只用VarByParam参数这种缓存是没有做到缓存数据的更新,这我就纳闷了。知道的可以告诉我一下。

但是如果只是设置一个参数的,当参数值发生变化时,缓存也发生变化。设置多个参数时直接用*表示,也是有缓存数据的更新的。

6.输出缓存VarByCustom参数的使用

输出缓存中VarBuCustome参数的主要作用是根据数据改变让客户端缓存过期并及时更新。

主要用于自定义输出缓存要求的任意文本。如果赋值该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义的字符串,则必须在应用程序的global.asax文件中重写 HttpAPPlication GetVaryByCustomString方法。


 
  1. public override string GetVaryByCustomString(Httpcontext context, string custom)

  2. {

  3. //custom 是Outputcache中的参数VaryByCustom参数值 ,VaryByCustome为*代指所有参数

  4. if (custom == "type")

  5. {

  6. return context.request.AnonymousID; //返回的这个字符串会与当前Action的缓存比较,字符串不一致则更新缓存。

  7. }

  8. return base.GetVaryByCustomString(context, custom);

  9. }

特性


 
  1. [OutputCache(VaryByCustom ="type",VaryByParam ="type",Duration =20)]

  2. public ActionResult ExampleVaryByCustom(string type)

  3. {

  4. ViewBag.type = type;

  5. return View();

  6. }

通过观察实现的效果很明显:在缓存持续的时间内,type参数值没有改变时 status Code 还是304 ,参数值发生改变时则是200重新生成页面了。

从这个即时更新的缓存来说已经达到要求了,当然这从业务上来说还是不够的。

可以得出的缓存结果,整个更新缓存的机制是 发现参数值不同便重新生成视图,就可以做到缓存的更新(当然更深入的缓存机制我也不知道,欢迎批评)

7.输出缓存SqlDependency的使用

首先我们还是来学习一下如何启用数据库缓存依赖项。

运行cmd命令: cd C:\windows\Microsoft.NET\Framework\v4.0.30319

运行相关命令: aspnet_regsql -S .  -U sa -P 123456  -ed -d 数据库名 -et -t 表名

解释一下

注册:aspnet_regsql -S . -E -ed -d 数据库名 -et -t 表名
删除:aspnet_regsql -S . -E -d 数据库名 -dt -t 表名
取消数据库缓存依赖: aspnet_regsql -S . -E -dd 数据库名数据库名 
列出已注册表:aspnet_regsql -S . -E -d 数据库名 -lt

如图:

现在我们已经开启数据库的缓存依赖,我们继续在webconfig这样配置。


 
  1.      <!---CacheProfile配置文件中设置缓存-->

  2.       <caching>   

  3.         <!--缓存的数据库依赖-->

  4.         <sqlCacheDependency>

  5.           <databases>

  6.             <add name="CacheDependencyProduct" connectionStringName="Conn" pollTime="1000"/>

  7.             <!--name:配置sqlDependency会用到,connectionStringName:数据库连接字符串的名称,pollTime:监听数据库变化的间隔时间,以毫秒为单位。即每隔1秒钟去监听数据库中的表Product是否有变化-->

  8.           </databases>

  9.         </sqlCacheDependency>

  10.         

  11.         <outputCacheSettings>

  12.           <outputCacheProfiles>

  13.             <!--<add name="exampleCacheProfile" duration="100"  location="Any" enabled="true"/>-->

  14.             <add name="exampleSqlDependency" duration="20"  location="Any" enabled="true" sqlDependency="CacheDependencyProduct:Product"/>

  15.            <!--sqlDenpendency:数据依赖节点名称+冒号+数据库表名(区分大小写)-->

  16.           </outputCacheProfiles>

  17.         </outputCacheSettings>

  18.       </caching> 

  19.     <!---CacheProfile配置文件中设置缓存end-->


 

当然还有数据库连接字符串,还是贴出来吧

[html] view plain copy

  1. <code class="language-html">  <connectionStrings>  
  2.     <!--<add name="DefaultConnection" connectionString="Data Source=(localDb)\MSSQLLocalDB;attachDbFilename=|DataDirectory|\aspnet-webapiToken-20170209085002.mdf;Initial Catalog=aspnet-webapiToken-20170209085002;Integrated Security=True" providername="System.Data.SqlClient" />-->  
  3.     <add name="Conn" connectionString="server=.;database=monitor;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/>  
  4.   </connectionStrings></code>  

为了看到效果可以在在视图中加个时间


 
  1. [OutputCache(CacheProfile = "exampleSqlDependency")]

  2. public ActionResult ExampleSqlDependency()

  3. {

  4. ViewBag.timeStr = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");

  5. return View();

  6. }

所实现的效果是:数据库的Product表数据没有任何变化时,20秒的缓存持续时间内,这个时间是不会变化的,也就是从浏览器缓存中去读取http Status Code 为304。

当Product有数据变化时,这个时间刷新成当前时间,也就是Action从新生成了Html文档返回给浏览器。

7.总结

输出缓存在实际的应用中还是需要自己去体会。在业务逻辑的处理中才更能体会到缓存的重要性。当然数据缓存也很重要,应用非常广泛,所以还是有必要去掌握。写的不足的地方希望给个评论指点一二。

作者:张林

相关阅读

Java 反射详解(76题)

转载请注明链接:https://blog.csdn.net/feather_wch/article/details/81771443 介绍Java的反射机制,包括底层原理、使用场景、性

魔兽世界技能输出宏

1、顺序执行(每一次只执行一个技能) #showtooltip /castsequence 鬼影缠身,腐蚀术,痛楚,痛苦无常

#SpringMVC--理解web.xml中的 url-pattern标签及其使

在web.xml中,我们通过下面的标签来匹配客户端发出的请求: <servlet-mapping> <servlet-name>yzh_ssh</servlet-name> <ur

qt刷单平台流程详解

现在不管是淘宝卖家还是刷手,qt刷单平台已经成为首选,想加入qt刷单平台,首先就要了解qt刷单平台,了解qt刷单平台流程,想知道qt刷单平台

excel表格打斜杠的方法步骤详解

Excel中经常需要使用到带有斜杠的表头,斜杠具体该如何在表格中打出呢?下面是seo实验室小编带来的关于excel表格打斜杠方法,希望阅读

分享到:

栏目导航

推荐阅读

热门阅读