博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC - 18.缓存
阅读量:6844 次
发布时间:2019-06-26

本文共 2289 字,大约阅读时间需要 7 分钟。

1.使用输出缓存 (不灵活,问题比较多,不建议使用)

///         /// datagrid列表        ///         /// 
[OutputCache(Duration = 10)] [HttpPost] public ActionResult MenuItemList() { JsonResponse json = BLL.RB_MenuItemService.Service.GetMenuItem(); string xjson = RBW.Common.Response.Return(json); return Content(xjson); }

 

[OutputCache(Duration = 10)] 我们让他缓存10秒钟。

 

  • VaryByContentEncoding
    VaryByCustom
    VaryByHeader
    VaryByParam

这四个参数的意思是,决定缓存中如何区分不同请求,就是说,哪些因素将决定使用还是不使用缓存。默认情况下,如果不做任何设置,那么在规定的时间内(我们称为缓存期间),所有用户,不管用什么方式来访问,都是直接读取缓存。

VaryByParam,可以根据用户请求的参数来决定是否读取缓存。这个参数主要指的就是QueryString。例如

如果我们缓存了,那么用这个地址来访问的时候,规定时间内都是读取缓存。但如果用这样的地址过来访问,显然我们希望不要读取缓存,因为参数不一样了。要实现这样的需求,也就是说,希望根据name参数的不同缓存不同的数据。则可以设置VaryByParam=”name”。

如果有多个参数的话,可以用逗号分开他们。例如 VaryByParam=”name,Id”

 

 

2.使用缓存配置文件

节点定义在system.web中

 

 

[OutputCache(CacheProfile = "CustomCache")]        public ActionResult About()        {        }

3.使用缓存API

通过上面的两步,我们了解到了使用OutputCache,并且结合CacheProfile,可以很好地实现灵活的缓存配置。但是有的时候,我们可能还希望对缓存控制得更加精细一些。因为OutputCache是对Action的缓存,不同的Action之间是不能共享数据的,假如某些数据,我们是在不同的Action之间共享的,那么,简单地采用OutputCache来做,就会导致对同一份数据,缓存多次的问题。

所以,ASP.NET除了提供OutputCache这种基于声明的输出缓存设置之外,还允许我们在代码中,自己控制要对哪些数据进行缓存,并且提供了更多的选项。

关于如何通过API的方式添加或者使用缓存,请参考

基本上就是使用HttpContext.Cache类型,可以完成所有的操作,而且足够灵活。

值得一提的是,我知道不少公司在项目中都会采用一些ORM框架,某些ORM框架中也允许实现缓存。例如NHibernate就提供了较为丰富的缓存功能,大致可以参考一下

需要注意的是,微软自己提供的Entity Framework本身并没有包含缓存的功能。

这里仍然要特别提醒一下,使用这种基于API的缓存方案,需要仔细推敲每一层缓存的设置是否合理,以及更新等问题。

4.使用缓存依赖

很早之前,在ASP.NET中设计缓存的时候,我们就可以使用缓存依赖的技术。关于缓存依赖,详细的信息请参考

实际上,这个技术确实很有用,ASP.NET默认提供了一个,可以通过配置,连接SQL Server数据库,当数据库的表发生变化的时候,会通知到ASP.NET,该缓存就会失效。

值得一提的是,不管是采用OutputCache这样的声明式的缓存方式,还是采用缓存API的方式,都可以使用到缓存依赖。而且使用缓存API的话,除了使用SqlCacheDependency之外,还可以使用标准的CacheDependency对象,实现对文件的依赖。

5.分布式缓存

上面提到的手段都很不错,如果应用系统不是很庞大的话,也够用了。需要注意的是,上面所提到的缓存手段,都是在Web服务器本地内存中进行缓存,这种做法的问题在于,如果我们需要做负载均衡(一般就会有多台服务器)的时候,就不可能在多台服务器之间共享到这些缓存。正因为如此,分布式缓存的概念就应运而生了。

谈到分布式缓存,目前比较受到大家认可的一个开源框架是 memcached。顾名思义,它仍然使用的是内存的缓存,只不过,它天生就是基于分布式的,它的访问都是直接通过tcp的方式,所以可以访问远程服务器,也可以多台Web服务器访问同一台缓存服务器。

关于memcached以及它在.NET中的使用,之前有一个朋友有写过一个介绍,可以参考使用一下

需要注意的是,分布式缓存不是为了来提高性能的(这可能是一个误区),并且可以肯定的是,它的速度一定会被本地慢一些。如果你的应用只有一台服务器就能满足要求,你就没有必要使用memcached。它的最大好处就是跨服务器,跨应用共享缓存。

 

 

 

参考:陈希章@中国

转载地址:http://fbdul.baihongyu.com/

你可能感兴趣的文章
JavaWeb技术之--面向对象设计模式
查看>>
test.log文件传输到另一台服务器上 --rsync
查看>>
复数类的实现
查看>>
Android 发布可穿戴设备 SDK 的开发者预览版
查看>>
ajax跨域请求
查看>>
记录自己面试遇到的难题及分析
查看>>
使用java+TestNG进行接口回归测试
查看>>
Linaria 1.0正式发布:一个零运行时CSS-in-JS库
查看>>
元数据驱动设计 —— 设计一套用于API数据检索的灵活引擎
查看>>
《The Manager’s Path》 作者 Camille Fournier 访谈
查看>>
Python 3.5正式发布,支持async/await异步编程
查看>>
ARKit奠定了Apple平台上实现AR的基石
查看>>
为什么说我们需要软件架构图?
查看>>
非泄露,NSA官方开源反汇编工具GHIDRA
查看>>
Rust核心团队前成员Brian Anderson加入PingCAP
查看>>
年终总结,程序员票选最喜欢的编程语言花落谁家?
查看>>
Suave 1.0发布,一个面向F#的Web服务器和开发库
查看>>
使用实体框架、Dapper和Chain的仓储模式实现策略
查看>>
V神推荐99%容错共识新算法
查看>>
直击微信公开课:2019年小程序将会有哪些改变?
查看>>