ASP.NET MVC 缓存

什么是缓存:

缓存是将信息(数据或页面)放在内存中以避免频繁的数据库存储或执行整个页面的生命周期,直到缓存的信息过期或依赖变更才再次从数据库中读取数据或重新执行页面的生命周期

哪里用缓存:

数据被频繁的使用,并且很少发生变化或对即时性的要求不高。

怎么用缓存:

.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:数据依赖的节的名称+冒号+数据表名称(小写)。如果这个依赖会用到多个表,则用分号间隔开

是分号不是逗号。眼花看错了。难改一直不对

时间: 2024-12-18 19:26:41

ASP.NET MVC 缓存的相关文章

ASP.NET MVC缓存

根据缓存的位置不同,可以区分为: ①客户端缓存(缓存在用户的客户端,例如浏览器中) ②服务器缓存(缓存在服务器中,可以缓存在内存中,也可以缓存在文件里,并且还可以进一步地区分为本地缓存和分布式缓存两种) 应该说,缓存的设计是一门较为复杂的学问,主要考虑的问题包括:要不要缓存?要缓存哪些数据?要缓存多少数据?要缓存多久?如何更新缓存(手动还是自动)?将缓存放在哪里?本文将以较为通俗易懂的方式,来看一看在MVC4的项目中,如何使用缓存功能.对于上述提到的一些具体业务问题,我这里不会进行太过深入地探讨

ASP.NET MVC 技术债务

ASP.NET MVC 缓存.本地化和监控诊断 ASP.NET MVC 认证与授权 Entity Framework 创建数据模型

ASP.NET MVC 数据库依赖缓存的实现

当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础.应用程序可以通过轮询获取数据变化的信息,使用轮询的话也不可能重新查一次后再和以前的数据做比较,如果这样的话如果我一个表里面有1000行数据我要是读100次的话是不是得比较1000 x 100 次,显然这种方法是不可行的,那怎么办呢?大家都学过触发器吧,实现数据库依赖缓存的轮询机制就是通过触发器来实现的. 实现步骤简单分析:     首先创建一个用于记录监控信息的表,表的字段就两个一个是表名,一个是版本号.然后,对

asp.net mvc,基于aop实现的接口访问统计、接口缓存等

其实asp.net 上aop现有的框架应该蛮多的,比如静态注入式的PostSharp(新版本好像已经商业化了,旧版本又不支持.net4.0+),或者通过反射的(性能会降低). 本文则是通过mvc其中一种方法拦截器ActionFilter(参考网上已经有很多类似例子). 首先新建一个日志控制类,命名为ApiLogAttribute,继承于ActionFilterAttribute /// <summary> /// 记录访问日志以及站点安全检查 /// </summary> publ

使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面

Donut Caching是缓存除了部分内容以外的整个页面的最好的方式,在它出现之前,我们使用"输出缓存"来缓存整个页面. 何时使用Donut Caching 假设你有一个应用程序中有像"主页"这种页面,它除了用户登录的用户名以外总是给用户呈现相同的或者很少变化的内容.这时你可能需要缓存大部分的内容.加入你使用"输出缓存"并应用一个VaryByParam UserID来做缓存处理,那么整个页面会为每个访问用户生成缓存,但是这当我们有很大量的登陆用

ASP.NET MVC 3 使用页面缓存 OutputCache 需要注意的问题

项目使用MVC3框架,页面使用缓存来缓解服务器压力,使用缓存配置文件设置CacheProfile <system.web> ...........<!--其他配置节点--> <caching> <outputCacheSettings> <outputCacheProfiles> <add name="index" duration="20" enabled="true" loca

ASP.NET MVC 实现与SQLSERVER的依赖缓存

本文主要是为了了解ASP.NET MVC 实现与SQLSERVER的依赖缓存的功能,针对自己对于这方面知识的学习的过程的一个记录.由于本人也是初次了解这个知识点,有哪些错误,还望高手不吝赐教哦.好,下面正式进入话题. 1.测试的环境及工具: vs2012 sqlserver2008r2 2.测试目的:当数据库的值有变化时候,页面的缓存也会及时更新. 具体步骤: 1.在VS2012中新建一个ASP.NET MVC 的空的项目. 2.新建一个HomeController ,并创建Index试图.代码

Asp.Net中MVC缓存详解

本文通过介绍了Asp.Net中MVC缓存的种类,以及他们之间的区别等内容,让学习者能够深入的了解MVC缓存的原理机制,以下是具体内容: 缓存是一种保存资源副本并在下次请求时直接使用该副本的技术.当 web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝. Web应用缓存技术大体上可以分为两类:服务端缓存和客户端缓存.两种目标都是减少重复性内容的生成和网络传输工作,因为缓存数据存储的位置不同,而分为服务端缓存和客户端缓存. 服务端缓存 服务端缓存技术关注于服务端数据查询,生成或者操作

如何在C#Asp.Net MVC使用Redis缓存

为什么要在Asp.Net MVC项目中使用Redis缓存呢?系统是按照高负载高并发来设计的,这就涉及服务器集群带来的问题,Session存储验证码或登录信息,在系统登录的时候,可能展示登录界面和存储验证码是一台服务器,登录验证的时候又是另外一个服务器,就会造成验证码找不到.重复登录等现象,所以必须系统公用的信息数据存储在一个地方,所有的服务器都从这个地方获取,这时我们就要用到Redis了,为什么要用Redis?Redis有什么优点?请自行度娘.下面我跟小伙伴们说说如何在C#Asp.Net MVC