缓存是将信息放在内存中以避免频繁访问数据库从数据库中提取数据,在系统优化过程中,缓存是比较普遍的优化做法和见效比较快的做法。

对于MVC有Control缓存和Action缓存。

一、Control缓存

Control缓存即是把缓存应用到整个Control上,该Control下的所有Action都会被缓存起来。

我们来看一下例子:

  [OutputCache(Duration = 10)]
public class HomeController : Controller
{ // GET: Home
public ActionResult Index()
{
ViewBag.CurrentTime = DateTime.Now;
return View();
}
}

view中:

@{
ViewBag.Title = "Index";
} <h2>@ViewBag.CurrentTime</h2>

效果:

不停的刷新页面,时间会每10秒钟更新一次。

二、Action缓存

将缓存加载Action上,这样,只有加缓存的Action才会有缓存,其他的Action没有。

写法与Control的缓存一样。

 //Action缓存,10秒
[OutputCache(Duration = 10)]
// GET: Home
public ActionResult Index()
{
ViewBag.CurrentTime = DateTime.Now;
return View();
} public ActionResult Index2()
{
ViewBag.CurrentTime = DateTime.Now;
return View();
}

这里分别有两个Action,一个加了缓存的Index,还有一个没有加缓存的Index2

效果:

分别访问这两个页面,不停的刷新这两个页面,Index 中的时间会10秒钟更新一次,而Index2中会实时更新。

三、使用配置文件进行缓存配置

在MVC的Web.config文件中,可以对缓存进行相关的配置。

在system.web节点中,添加caching子节点,然后如下:

 <outputCacheSettings>
<outputCacheProfiles>
<add name="TestConfigCache" duration="10" />
</outputCacheProfiles>
</outputCacheSettings>

配置好后,我们的Control缓存或者Action缓存就可以这么写:

        [OutputCache(CacheProfile= "TestConfigCache")]
// GET: Home
public ActionResult Index()
{
ViewBag.CurrentTime = DateTime.Now;
return View();
}

四、缓存依赖

缓存数据是从数据库中某个表获取的,如果数据库中对应的表的数据没有发生改变,我们就没有必要对缓存数据进行更新,如果数据库对应的表的数据发生了变化,那么,我们相应的缓存数据就应立即更新。

那么缓存是否过期,依赖于数据库对应的表中的数据是否发生变化。这就是缓存依赖。下面我们来写一下。

我们MVC的Web.config文件中进行如下未配置:

1、首先配置数据库连接字符串:

 <connectionStrings>
<add name="sqlCon" connectionString="server=127.0.0.1;database=test;uid=sa;pwd=123456" providerName="System.Data.SqlClient" />
</connectionStrings>

2、进行缓存依赖配置:

    <caching>
<sqlCacheDependency>
<databases>
<add name="PersonCacheDependency" connectionStringName="sqlCon" pollTime="500"/>
</databases>
</sqlCacheDependency>
<outputCacheSettings>
<outputCacheProfiles>
<add name="TestConfigCache" duration="3600" sqlDependency="PersonCacheDependency:Person"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>

其中pollTime为监听数据库变化的间隔时间(毫秒)

以上配置说明:库名:test,监听表名:Person。缓存时间为:3600秒即一小时。数据库依赖周期为500毫秒,即每0.5秒监听下数据库是否有变化,如果有变化则立即更新缓存。

Control中或Action中:

        [OutputCache(CacheProfile= "TestConfigCache")]
// GET: Home
public ActionResult Index()
{
ViewBag.CurrentTime = DateTime.Now;
return View();
}

这样,在一个小时内,只有Person表中的数据发生变化后,缓存才会更新,不然缓存不会更新。

五、注:

当我们配置完缓存以来后,运行我们的项目,可能会出现一下错误提示:

这是因为我们没有对Person表启用缓存通知。

打开vs命令工具行,输入:aspnet_regsql -S localhost -U sa -P 123456 -ed -d test-et -t Person

这样就可以解决上述错误。

Mvc_缓存浅谈的更多相关文章

  1. http缓存浅谈

    我们在访问百度首页的时候,会发现不管怎么刷新页面,静态资源基本都是返回 200(from cache): 随便点开一个静态资源是酱的: 哎哟有Response报头数据呢,看来服务器也正常返回了etag ...

  2. Spring缓存框架原理浅谈

    运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...

  3. 浅谈mysql innodb缓存策略

    浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...

  4. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  5. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  6. 浅谈HTTP缓存以及后端,前端如何具体实现HTTP缓存

    <浅谈HTPP缓存>原版: https://juejin.im/post/5bdeabbbe51d4505466cd741?utm_source=gold_browser_extensio ...

  7. [转]浅谈电路设计中应用DDR3处理缓存问题

    本文转自:浅谈电路设计中应用DDR3处理缓存问题_若海人生的专栏-CSDN博客 DDR系列SDRAM存储芯片的高速率.高集成度和低成本使其理所当然成为存储芯片中的一霸.在PC和消费电子领域自是如此,它 ...

  8. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  9. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

随机推荐

  1. 高通GPIO驱动(DTS方式)

    gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...

  2. python中json序列化的东东

    之所以写这个因为自己总是弄混了,容易弄错,记下来有事没事看看   序列化是指把变量从内存中变成可存储或传输的过程称之为序列化用(使用dump或者dumps),把变量内容从序列化的对象重新读到 内存里称 ...

  3. 详细理解平衡二叉树AVL与Python实现

    前言 上一篇文章讨论的二叉搜索树,其时间复杂度最好的情况下是O(log(n)),但是最坏的情况是O(n),什么时候是O(n)呢? 像这样: 如果先插入10,再插入20,再插入30,再插入40就会成上边 ...

  4. Vs .Net Framework 灵活配置

    背景:我们开发和部署项目时都是通过注释某些配置项 比如: 在调试时就注释掉生产的配置项,在生产时又要改回来,只有一个还好,如果多的话就会非常容易出错. 问题1:在发布时容易出错,需要控制发布时根据配置 ...

  5. Linux 小知识翻译 - 「Linux之父 Linus」

    作为新年的第一次,这次想简单介绍下Linus这个人.(这篇文章是作者新年初写的,所以有这么句话) Linux之父,同时也是现在linux内核开发最终决定的人物就是「Linus Torvalds」.「L ...

  6. CSS Hack的一些知识

    测试环境:Windows7 主要测试:IE6.IE7.IE8.Fire Fox3.5.6 次要测试:Chrome4.0.Opera10.10.Safari4.04.360浏览器3.1 为了能够让多个H ...

  7. PCB (3)创建新工程PCB

    点击完成 拖进我们创建的工程中

  8. C# 语法四 修饰符

    1.sealed 不能派生 2.internal 仅仅在本项目中被访问 3.public 整个系统 4.private 本类访问 5.protected 本类.派生类访问 using System; ...

  9. Android学习之基础知识四-Activity活动1讲

    一.活动(Activity)的基本用法: 1.手动创建活动FirstActivity(java源码): A.Android Studio在一个工作区间只允许打开一个项目,点击:File--->C ...

  10. android java.lang.NoClassDefFoundError: cn.yw.lib.viewpagerfragment.ViewPagerFragmentActivity

    假如你判断你的项目没有异常,并且该注册的Activity也注册了.那么解决这个问题的方法就是:右击项目->properties->Java Build Path->Order and ...