通过这篇文章你将学习到在MVC中如何使用输出缓存,业务逻辑我就不多介绍了,主要是Outputcache的基本使用。至于数据缓存还是等我的下一篇文章吧,一步一步来不急的。
输出缓存的使用方法是在Controller 或Action上打[OutPutCache]特性即可。我这里以Action为示例
[OutputCache(Duration =20)]//设置过期时间为20秒 public ActionResult ExampleCache() { var timeStr =DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"); ViewBag.timeStr = timeStr; return View(); }
在20秒时间差距内页面上的时间都不会被改变。他在Response Header中过期时间和上次修改的时间正好相隔20秒。Http StatusCode 304 这个我得简单介绍下,这个页面是缓存在客户端浏览器的,服务器在接收响应时(还没有超过20秒)并没有返回给浏览器一个新的html文档,只是告诉浏览器 No Modified,从本地去读取即可。当然有必要去了解一下304 ,介绍看看这篇文章http状态码304的介绍
在Controller上加OutputCache特性时,Controller下的所有的Action都将实现此特性。如果同时Action也有此特性时,以Action为标准,Action的粒度更精细。
在Controller上加OutputCache特性时,Controller下的所有的Action都将实现此特性。如果同时Action也有此特性时,以Action为标准,Action的粒度更精细。
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 依赖项,根据数据库的变化更新缓存 |
对于这些参数如何使用我就写几个例子,看看效果吧。
这种方式便于统一配置,当然也可以设置参数duration、location 、varybyparam等。我们需要在system.web 节点下加入这些
<!---CacheProfile配置文件中设置缓存--> <caching> <outputCacheSettings> <outputCacheProfiles> <add name="exampleCacheProfile" duration="20" location="Any" enabled="true"/> </outputCacheProfiles> </outputCacheSettings> </caching> <!---CacheProfile配置文件中设置缓存end-->
2.输出缓存VarByParam参数的使用
简单点来说就是根据不同的参数值生成缓存。代码是这样的
[OutputCache(Duration =20,VaryByParam ="type,page")] public ActionResult ExampleVaryByParam(string type,int page) { ViewBag.type = type; ViewBag.page= page; return View(); }
还是200 ,所以只用VarByParam参数这种缓存是没有做到缓存数据的更新,这我就纳闷了。知道的可以告诉我一下。
但是如果只是设置一个参数的,当参数值发生变化时,缓存也发生变化。设置多个参数时直接用*表示,也是有缓存数据的更新的。
输出缓存中VarBuCustome参数的主要作用是根据数据改变让客户端缓存过期并及时更新。主要用于自定义输出缓存要求的任意文本。如果赋值该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义的字符串,则必须在应用程序的Global.asax文件中重写 Httpapplication GetVaryByCustomString方法。
public override string GetVaryByCustomString(HttpContext context, string custom) { //custom 是Outputcache中的参数VaryByCustom参数值 ,VaryByCustome为*代指所有参数 if (custom == "type") { return context.Request.AnonymousID; //返回的这个字符串会与当前Action的缓存比较,字符串不一致则更新缓存。 } return base.GetVaryByCustomString(context, custom); }
特性
[OutputCache(VaryByCustom ="type",VaryByParam ="type",Duration =20)] public ActionResult ExampleVaryByCustom(string type) { ViewBag.type = type; return View(); }
从这个即时更新的缓存来说已经达到要求了,当然这从业务上来说还是不够的。
可以得出的缓存结果,整个更新缓存的机制是 发现参数值不同便重新生成视图,就可以做到缓存的更新(当然更深入的缓存机制我也不知道,欢迎批评)
4.输出缓存SqlDependency的使用
首先我们还是来学习一下如何启用数据库缓存依赖项。
运行cmd命令: cd C:WindowsMicrosoft.NETFrameworkv4.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这样配置。
<!---CacheProfile配置文件中设置缓存--> <caching> <!--缓存的数据库依赖--> <sqlCacheDependency> <databases> <add name="CacheDependencyProduct" connectionStringName="Conn" pollTime="1000"/> <!--name:配置sqlDependency会用到,connectionStringName:数据库连接字符串的名称,pollTime:监听数据库变化的间隔时间,以毫秒为单位。即每隔1秒钟去监听数据库中的表Product是否有变化--> </databases> </sqlCacheDependency> <outputCacheSettings> <outputCacheProfiles> <!--<add name="exampleCacheProfile" duration="100" location="Any" enabled="true"/>--> <add name="exampleSqlDependency" duration="20" location="Any" enabled="true" sqlDependency="CacheDependencyProduct:Product"/> <!--sqlDenpendency:数据依赖节点名称+冒号+数据库表名(区分大小写)--> </outputCacheProfiles> </outputCacheSettings> </caching> <!---CacheProfile配置文件中设置缓存end-->
当然还有数据库连接字符串,还是贴出来吧
<code class="language-html"> <connectionStrings> <!--<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" />--> <add name="Conn" connectionString="server=.;database=Monitor;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/> </connectionStrings>
为了看到效果可以在在视图中加个时间
[OutputCache(CacheProfile = "exampleSqlDependency")] public ActionResult ExampleSqlDependency() { ViewBag.timeStr = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"); return View(); }
所实现的效果是:数据库的Product表数据没有任何变化时,20秒的缓存持续时间内,这个时间是不会变化的,也就是从浏览器缓存中去读取http Status Code 为304。
当Product有数据变化时,这个时间刷新成当前时间,也就是Action从新生成了Html文档返回给浏览器。
5.总结
输出缓存在实际的应用中还是需要自己去体会。在业务逻辑的处理中才更能体会到缓存的重要性。当然数据缓存也很重要,应用非常广泛,所以还是有必要去掌握。写的不足的地方希望给个评论指点一二。