服务端缓存技术

  • 请求域内的缓存

  每个Asp.Net请求都会在Asp.Net框架中创建一个新的System.Web.HttpContext对象(HttpContext对象封装有关个别 HTTP 请求的所有 HTTP 特定的信息)。在HttpContext对象的一个属性就是HttpContext.Items,这个属性也会存在于请求的整个周期,以HttpContext.Items为媒介可以解除各个组件之间的耦合。Items是一个IDictionary的类型可以直接通过HttpContext.Item["key"]=value的形式获取。Items可以用户获取Asp.Net请求过程中IHttpModule和IHttpHandler之间组织和共享数据的键值对。

  • 用户域内的缓存

  用户域的缓存 也就是平常使用的HttpContext.Session,仅仅是当前用户的缓存,不能实现跨用户共享数据。Aspnet的会话状态可以再多个请求之间共享数据,记得这个只能是当前用户可以得到共享数据。会话状态空闲一段时间后会过期,当然可以通过Web.config的<system.web>节点下修改<seesionState timeout="30" />进行设置,当然还有其他参数可以进行设置。

  • 应用程序域内的缓存

  平常使用的HttpContext.Application,为当前 HTTP 请求获取 HttpApplicationState 对象。那么就是HttpApplicationState管理这应用程序级别的数据。微软官方的解释:“启用 ASP.NET 应用程序中多个会话和请求之间的全局信息共享。”,一样也是一个键值对类型。存储在HttpApplicationState的数据生命空间域托管网站的IIS工作进程一样长,因为IIS不是Asp.NET管理着工作线程的生命周期。HttpApplicationState也是不是可靠地数据存储方式。

  • Asp.Net缓存

  平常比较经常用的HttpContext.Cache进行访问,与Application一样也是应用程序域的数据。Cache存储的数据不好限制在单个请求或者用户会话范围内。HttpContext.Cache与Application还是有区别的,Application可以扩工作进程的访问。HttpContext.Cache以HttpRuntime.Cache的实现。我们知道HttpContext是通过封装个别的Http请求信息所得到的只能应用于Web应用上,而HttpRuntime.Cache是获取当前应用程序的Cache对象,可以非web应用。 使用Cache对象的时候可以设置过期时间(有两种方式其一设置间隔时间,用于指定缓存数据在最后一次访问之后多长过期,其二指定固定时间设置失效。对于Cache添加数据的时候还有一个缓存依赖数据,我们可以通过指定依赖项,来决定其生命周期缓存依赖策略

依赖类型   定义
Aggregate(聚合) 提供多个依赖(通过System.Web.Caching.AggregateCache)。只有删除所有依赖项才能删除该缓存记录
Custom(自定义)    缓存数据依赖一个继承自System.Web.Caching.Cache的自定义类,例如,可以创建一个web服务缓存依赖,当查询某个值时,就删除缓存数据
File(文件)   缓存数据依赖某个外部的文件,删除文件就会删除该数据
Key(键)  缓存数据依赖应用程序缓存里另外一个缓存数据(通过缓存的key关联),删除依赖的缓存数据就会删除该数据。
SQL 缓存数据依赖MicrosoftSQLServer某个表的数据变化,当表更新时,缓存数据就会删除。
  • 输出缓存

  平常用于输出缓存主要是OutputCache属性,当使用OutputCache属性缓存页面,用户访问到页面时,首先会查看服务器的是否有该页面的缓存,若有则直接获取显示出来,而不会执行数据操作生成页面。我们可以对OutputCache属性进行参数的设置比如Duration可以设置缓存的时间等。具体可以查看微软的Msdn。具体的使用如下所示:

[OutputCache(Duration=60,VaryByParam="none"]
public ActionResult Contact()
{
ViewBag.Message=DateTime.Now.ToString();
return View()
}

这里列出OutputCacheAttribute定义的属性

参数  描述
CacheProfile 使用的输出缓存策略的名字
Duration 缓存内容的生命周期
Enabled 是否启用缓存
Location 缓存地址默认设置为Any,这以为这内容可以缓存到三个地方Web 服务器、任何代理服务器和用户浏览器。
NoStore   是否启用Http Cache-Control
SqlDependency 缓存依赖的数据库和表名称
VaryByContentEncoding 都好分割的字符编码列表,用来区分输入缓存
VaryByCustom 自动以字符串用来区分输出缓存
VaryByHeader 都好分割的HTTP消息头,区分缓存
VaryByParam 通过分割的Post表单或者查询字符串来区分缓存,比如查看某个id下的页面的页面,可以设置该属性为"id"
  • 甜圈圈缓存(donut caching)

甜圈圈缓存是指只是缓存页面的外围内容,允许部分内容动态变化;与之相反的是甜圈圈洞的缓存(donut hole caching)(也就是缓存内部部分内容,而 允许外围内容的更新)。可以通过调用HttpResponse中的一个WriteSubstitution()方法实现甜圈圈缓存。具体的使用如下所示:

public delegate string CacheCallback(HttpContextBase context);

public static object Substitution(this HtmlHelper html, CacheCallback ccb)
{
html.ViewContext.HttpContext.Response.WriteSubstitution(
c=>HttpUtility.HtmlEncode(
ccb(new HttpContextWrapper(c)
));
} //具体调用
@Html.Substitution(context=>context.User.Identity.Name)

当然也可以引入MvcDonutCachingNuGet包提供几种高级的缓存扩展方法,也提供了操作方法使用DonutOutputCacheAttribute标记属性。

  • 甜圈圈洞缓存

缓存只是页面中的一小部分,针对某些类别信息是不会变化可以进行缓存。具体的使用如下:

[ChildActionOnly]
[OutputCache(Duration=60)]
public ActionResult CategoriesAction()
{
ViewBag.Categories=Model.GetCategories();
return View();
} //对应的页面CategoriesAction
@foreach(var item in ViewBag.Categories as IEnumerable<Category>)
{
@Html.ActionLink(item.Name,"category","categories",new{categoryId=category.Id})
} //其他主页面调用,调用第一次的调用结果缓存起来,下次渲染的时候直接从缓存中获得列表
<body>
@Html.Action("CategoriesAction");
</body>

客户端缓存技术

  • 浏览器缓存

浏览器在本地的资源通过三个机制控制:新的(freshness )验证(validation)和失效的(invalidation)这三者属于Http的一部分,并且定在Http消息头里。

新的允许应答消息直接使用,而不需要经过服务器检查,额可以同被服务器和客户端控制。例如Expires过期的消息头设置了资源过期的时间,而Cache-Control:maxage则停工的是应答消息需要经过多久才刷新。

验证:用来检查陈旧的缓存数据是否依赖有效。如果缓存的应答数据包含Last-Modified消息头,则缓存就可以使用If-Modified-Since消息头来检查内容是否更新过。也可以通过ETag进行更强的控制。

失效:通常是指另一个缓存请求的错误请求

  • AppCache缓存和本地缓存(Html5新特性)【暂不介绍】

参考:Asp.Net Mvc 4 WEeb 编程

AspNet MVC 缓存的更多相关文章

  1. Encountered an unexpected error when attempting to resolve tag helper directive '@addTagHelper' with value '"*, Microsoft.AspNet.Mvc.TagHelpers"'

    project.json 配置: { "version": "1.0.0-*", "compilationOptions": { " ...

  2. VS2015突然报错————Encountered an unexpected error when attempting to resolve tag helper directive '@addTagHelper' with value 'Microsoft.AspNet.Mvc.Razor.TagHelpers.UrlResolutionTagHelper

    Encountered an unexpected error when attempting to resolve tag helper directive '@addTagHelper' with ...

  3. MVC缓存

    MVC入门系列教程-视频版本,已入驻51CTO学院,文本+视频学效果更好哦.视频链接地址如下: 点我查看视频.另外,针对该系列教程博主提供有偿技术支持,群号:226090960,群内会针对该教程的问题 ...

  4. MVC 缓存

    MVC  缓存 http://blog.zhaojie.me/2009/09/aspnet-mvc-fragment-cache-1.html redis http://www.cnblogs.com ...

  5. AspNet MVC中各种上下文理解

    0  前言 AspNet MVC中比较重要的上下文,有如下: 核心的上下文有HttpContext(请求上下文),ControllerContext(控制器上下文) 过滤器有关有五个的上下文Actio ...

  6. AspNet MVC与T4,我定制的视图模板

    一. 遇到的问题 文章开头部分想先说一下自己的困惑,在用AspNet MVC时,完成Action的编写,然后添加一个视图,这个时候弹出一个添加视图的选项窗口,如下: 很熟悉吧,继续上面说的,我添加一个 ...

  7. ASPNET MVC中断请求

    ASPNET MVC如何正确的中断请求? 感觉是这样? 在aspnet开发过程中如果想要中断当前的http处理,以前在aspnet中一直是Response.End(); 在这Response.End( ...

  8. MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom

    <MVC缓存OutPutCache学习笔记 (一) 参数配置> 本篇来介绍如何使用 VaryByCustom参数来实现缓存的及时化.. 根据数据改变来及时使客户端缓存过期并更新.. 首先更 ...

  9. MVC缓存OutPutCache学习笔记 (一) 参数配置

    OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...

随机推荐

  1. xfire webServeic 例子

    xfire webServeic 例子,参考网上众多例子,自己写得完成了,给大家分享 大家只要按这个目录去建文件就可以了,然后运行,至于其中原理慢慢理会吧 环境:myeclipse 10 +xfire ...

  2. HTML标签CSS默认值研究

    最近写css的时候,发现在div元素里面添加ul元素后发现,ul列表在div里面距离最上方总是有一段空行,当时很奇怪,以为是哪个css出了问题,就把css去掉了,发现问题依旧,然后就查了一下发现htm ...

  3. 平行四边形TikZ作图

    %!TEX program = pdflatex \documentclass[varwidth=true, border=2pt]{standalone} \usepackage{tikz} \us ...

  4. eclipse tomcat maven热部署

    1.  tomcat插件 如果是Kepler的话,已经自带了tomcat插件,如果没有,到http://www.eclipsetotale.com/tomcatPlugin.html下载安装或在线安装 ...

  5. java基础七 [图形用户接口](阅读Head First Java记录)

    到目前为止我们接触的都是Java的命令行,但是为了让用户使用,必须有图形化界面,所以这章主要讲的是怎么使用GUI(图形用户接口)   创建一个GUI:javax.swing.* 本章讲的布局相关内容都 ...

  6. 《机器学习实战》学习笔记——第14章 利用SVD简化数据

    一. SVD 1. 基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2)优点:简化数据, 去除噪声,提高算法的结果 (3)缺点: ...

  7. 安装crab

    1. crab 介绍: Recommender systems in Python 官网介绍:http://muricoca.github.io/crab/ 在安装过程中,发现一个问题,我已经安装了A ...

  8. iOS出现<object returned empty description>的解决方法

    iOS出现<object returned empty description>的解决方法: 使用  [str length] <= 0  判断处理

  9. java多线程学习-同步之线程通信

    这个示例是网上烂大街的,子线程循环100次,主线程循环50次,但是我试了很多次,而且从网上找了很多示例,其实多运行几次,看输出结果并不正确.不知道是我转牛角尖了,还是怎么了.也没有大神问,好痛苦.现在 ...

  10. Angular.js参考

    http://www.cnblogs.com/popo123/p/5673955.html