zoukankan      html  css  js  c++  java
  • Mvc_缓存浅谈

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

    对于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

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

  • 相关阅读:
    思科 ASA 系列防火墙 官方文档下载指南
    Batch批量替换hosts
    OPCDA通信--工作在透明模式下的CISCO ASA 5506-X防火墙配置
    OPC DA通讯 KEP6.4 DCOM 配置脚本
    拖放获取文件信息的bat代码
    禁用UpdateOrchestrator重新启动任务
    SIAMATIC S7-1200 中通过 Modbus RTU 如何读取地址范围 9999 到 65535 的输入字
    提问的智慧 (提问前必读)
    [AHK]输入法状态提示,中文状态提示“中”,英文状态提示“EN”[转]
    Wincc V7.3SE安装截图
  • 原文地址:https://www.cnblogs.com/ingstyle/p/6731856.html
Copyright © 2011-2022 走看看