为什么要用缓存
为什么要用缓存呢,说缓存之前先说使用缓存的优点。
减少寄宿服务器的往返调用(round-trips)。
如果缓存在客户端或是代理,将减少对服务器的请求,减少带宽。
减少对数据库服务器的往返调用(round-trips)。
当内容缓存在web服务器,能够减轻对数据库的请求。
减少网络带宽。
避免了重新生成可重用内容的时耗。
提高性能
因为缓存减少了round-trips, network traffic(网络带宽),并避免- 了生成可重用内容的时耗,所以对性能有巨大的提高。
传统的缓存方式传统的缓存方式如下面这张图
之前我们处理方式处理起来也很简单
页面输出缓存,直接在 ASP.NET中页面缓存的使用OutputCache 在aspx页的顶部加这样一句即可:
<%@ OutputCache Duration="60" VaryByParam="none" %>
Duration 表示缓存的时间秒,必选,否则报错。
第二种方式
if (this.Cache["Keys"] == null)
{
this.Cache.Insert("Keys", List, null, DateTime.Now.AddHours(2), TimeSpan.Zero);
}
这里是检查缓存中Keys是否存在,如果不存在,则写入一个新的值List.还有其他的一些使用方法。
上面两种方式显然不在现在使用范畴,也不在我想说的范畴之内。,年代貌似有点久远,不用webform基本用不到。现在我们更多是的使用MVC。
我们想说的是MVC输出缓存。
输出缓存:Outputcache ,分为Action输出缓存和Controller输出缓存。使用的场景包括某个页面的数据更新不是很频繁,不需要每次都从数据库区查询。缓存起来从内存中读取。
数据缓存:是相对于全局的。任何地方需要调用的时候都可以去调用。使用的场景包括权限管理这种模块的。每个角色对于菜单的访问都是固定的,所以有必要将角色,权限,菜单这种数据做一个全局的数据缓存。修改时再做缓存的更新。
输出缓存和数据缓存区别:打个比方输出缓存就像是“局部变量”,数据缓存就像是全局变量(只是个比喻)。
Controller输出缓存和 Action缓存使用方式是一样的,就是Controller 或Action上打[OutPutCache]特性标签。但是他们之间又是有区别的。
一、控制器缓存
Control缓存的作用域是整个控制器,所以在这个控制器下的所有Action都会被缓存起来。Control缓存的粒度比较粗,应用也比较少些。
[OutputCache(Duration = 10)] public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.CurrentTime = DateTime.Now;
return View();
}
}
二、Action缓存
将[OutPutCache]特性标签打在Action上,这样,只有加缓存的Action才会有缓存,其他的Action是没有的。
AllowMultiple 获取或设置一个值,该值指示是否可指定筛选器特性的多个实例。
CacheProfile 获取或设置缓存配置文件名称。
ChildActionCache 获取或设置子操作缓存。
Duration 获取或设置缓存持续时间(以秒为单位)。
Location 获取或设置位置。
NoStore 获取或设置一个值,该值指示是否存储缓存。
Order 获取或者设置执行操作筛选器的顺序。
SqlDependency 获取或设置 SQL 依赖项。
TypeId (从Attribute继承。)
VaryByContentEncoding 获取或设置基于内容变化的编码。
VaryByCustom 获取或设置基于自定义项变化的值。
VaryByHeader 获取或设置基于标头变化的值。
VaryByParam 获取或设置基于参数变化的值。
输出缓存CacheProfile使用配置文件设置缓存
举例其中的CacheProfile,这种方式便于统一配置,当然也可以设置参数duration、location 、varybyparam等。我们需要在system.web 节点下加入这些
<!---CacheProfile配置文件中设置缓存-->
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add duration="20" location="Any" enabled="true"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching> <!---CacheProfile配置文件中设置缓存end-->
其实作用和效果还是一样,无非就是方便点,统一的配置参数都直接写webconfig文件里面。其实也可以Controller中写。
配置好了之后我们直接在控制器调用相应的名字的OutputCache特性标签即可。
[OutputCache(CacheProfile= "TestConfigCache")]
public ActionResult Index()
{
ViewBag.CurrentTime = DateTime.Now;
return View();
}
更多的方式,需要下去再研究下。