什么是缓存:
缓存是将信息(数据或页面)放在内存中以避免频繁的数据库存储或执行整个页面的生命周期,直到缓存的信息过期或依赖变更才再次从数据库中读取数据或重新执行页面的生命周期
哪里用缓存:
数据被频繁的使用,并且很少发生变化或对即时性的要求不高。
怎么用缓存:
.NET自带的缓存分为 Control缓存、Action缓存、配置缓存(这是逻辑上的区分,在用法和实现上其实是一样的)通过OutputCache关键字来实现缓存。用起来是十分的容易。
我们先看下OutputCache的实现。这个实现用到了Attribute特性
using System; using System.Web.UI; namespace System.Web.Mvc { // Summary: // Represents an attribute that is used to mark an action method whose output // will be cached. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter { // Summary: // Initializes a new instance of the System.Web.Mvc.OutputCacheAttribute class. public OutputCacheAttribute(); // Summary: // Gets or sets the cache profile name. // // Returns: // The cache profile name. public string CacheProfile { get; set; } // // Summary: // Gets or sets the child action cache. // // Returns: // The child action cache. public static System.Runtime.Caching.ObjectCache ChildActionCache { get; set; } // // Summary: // Gets or sets the cache duration, in seconds. // // Returns: // The cache duration. public int Duration { get; set; } // // Summary: // Gets or sets the location. // // Returns: // The location. public OutputCacheLocation Location { get; set; } // // Summary: // Gets or sets a value that indicates whether to store the cache. // // Returns: // true if the cache should be stored; otherwise, false. public bool NoStore { get; set; } // // Summary: // Gets or sets the SQL dependency. // // Returns: // The SQL dependency. public string SqlDependency { get; set; } // // Summary: // Gets or sets the vary-by-content encoding. // // Returns: // The vary-by-content encoding. public string VaryByContentEncoding { get; set; } // // Summary: // Gets or sets the vary-by-custom value. // // Returns: // The vary-by-custom value. public string VaryByCustom { get; set; } // // Summary: // Gets or sets the vary-by-header value. // // Returns: // The vary-by-header value. public string VaryByHeader { get; set; } // // Summary: // Gets or sets the vary-by-param value. // // Returns: // The vary-by-param value. public string VaryByParam { get; set; } // Summary: // Returns a value that indicates whether a child action cache is active. // // Parameters: // controllerContext: // The controller context. // // Returns: // true if the child action cache is active; otherwise, false. public static bool IsChildActionCacheActive(ControllerContext controllerContext); // // Summary: // This method is an implementation of System.Web.Mvc.IActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext) // and supports the ASP.NET MVC infrastructure. It is not intended to be used // directly from your code. // // Parameters: // filterContext: // The filter context. public override void OnActionExecuted(ActionExecutedContext filterContext); // // Summary: // This method is an implementation of System.Web.Mvc.IActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext) // and supports the ASP.NET MVC infrastructure. It is not intended to be used // directly from your code. // // Parameters: // filterContext: // The filter context. public override void OnActionExecuting(ActionExecutingContext filterContext); // // Summary: // This method is an implementation of System.Web.Mvc.IExceptionFilter.OnException(System.Web.Mvc.ExceptionContext) // and supports the ASP.NET MVC infrastructure. It is not intended to be used // directly from your code. // // Parameters: // filterContext: // The filter context. public void OnException(ExceptionContext filterContext); // // Summary: // This method is an implementation of System.Web.Mvc.IResultFilter.OnResultExecuted(System.Web.Mvc.ResultExecutedContext) // and supports the ASP.NET MVC infrastructure. It is not intended to be used // directly from your code. // // Parameters: // filterContext: // The filter context. public override void OnResultExecuted(ResultExecutedContext filterContext); // // Summary: // Called before the action result executes. // // Parameters: // filterContext: // The filter context, which encapsulates information for using System.Web.Mvc.AuthorizeAttribute. // // Exceptions: // System.ArgumentNullException: // The filterContext parameter is null. public override void OnResultExecuting(ResultExecutingContext filterContext); } }
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
通过这段代码我们知道了四个重要的信息
这个特性只能用在类(control)和方法(Action)上,Inherited=true 表示这个类允许被继承,AllowMultiple = false 它规定了特性不能被重复放置多次
当Control与Action都应用了缓存时,以Action的缓存为主。
常用属性:
1)CacheProfile:缓存使用的配置文件的缓存名称。
2)Duration:缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的。
3)OutputCacheLocation:枚举类型,缓存的位置。当设置成None时,所有缓存将失效,默认为Any。
Any:页面被缓存在浏览器、代理服务器端和web服务器端;
Client:缓存在浏览器;
DownStream:页面被缓存在浏览器和任何的代理服务器端;
Server:页面被缓存在Web服务器端;
None:页面不缓存;
ServerAndClient:页面被缓存在浏览器和web服务器端;
4)VaryByParam:用于多个输出缓存的字符串列表,并以分号进行分隔。默认时,该字符串与GET方法传递的参数或与POST方法传递的变 量相对应。当被设置为多个参数时,输出缓存将会为每个参数都准备一个与之相对应的文档版本。可能值包括none,*,以及任何有效的查询串或POST参数 名称。
如果您不想要为不同的已缓存内容指定参数,可以将其设置为none。如果想要指定所有的已缓存内容参数,可以设置为*。
具体的用法:Control缓存:
//当前控制器下所有数据和页面缓存10秒,10秒后过期当再次触发时更新缓存 [OutputCache(Duration = 10)] public class ControlController : Controller { // //这样就是一个Action缓存了
[OutputCache(Duration = 10)] public ActionResult Index() { ViewBag.CurrentTime = System.DateTime.Now; return View(); } public ActionResult Index1() { ViewBag.CurrentTime = System.DateTime.Now; return View(); } }
Action缓存只需要把关键字写在Action上
配置缓存:就不写了。感觉不实用,1.通过代码实现缓存一点都不复杂,就是一句话的事。我实在想不出为啥要写到配置文件。
真正有用的其实是这个:缓存依赖
为什么说这个有用?我们大部分写的程序其实是业务程序,对于业务程序来说一切业务流程都是为了最终的数据,那么数据变化了。缓存自然要变化。不然业务程序也就没啥意思了
在配置文件中,system.web节点下增加如下节点
<caching> <sqlCacheDependency><!--缓存的数据库依赖节--> <databases> <add name="UserCacheDependency" connectionStringName="Conn" pollTime="500"/><!--Conn:数据库连接字符串的名称,name随便启名,缓存节会用到--> </databases> </sqlCacheDependency> <outputCacheSettings> <outputCacheProfiles> <add name="SqlDependencyCache" duration="3600" sqlDependency="UserCacheDependency:user"/><!--UserCacheDependency:数据库依赖配置节的名称,user:数据库中需要监听的表名称--> </outputCacheProfiles> </outputCacheSettings> </caching>
1)由于是缓存对数据库的依赖,此外必须包含connectionStrings的节。
2)<add name="UserCacheDependency" connectionStringName="Conn" pollTime="500"/>
connectionStringName:数据库连接字符串的名称
pollTime:监听数据库变化的周期,以毫秒为单位。即每500毫秒查看下数据库是否有变化。
3)<add name="SqlDependencyCache" duration="3600" sqlDependency="UserCacheDependency:user"/>
sqlDependency:数据依赖的节的名称+冒号+数据表名称(小写)。如果这个依赖会用到多个表,则用分号间隔开
是分号不是逗号。眼花看错了。难改一直不对