asp.net mvc5中使用缓存依赖SqlCacheDependency



今天来演示一下在asp.net mvc5中怎么使用缓存依赖。

缓存是用来提高应用性能,降低服务器压力。适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存。使用缓存最麻烦的就是保持源数据和缓存的中的数据一致。

缓存(Cache)依赖,就是缓存是否更新依赖于其它Object。.net的缓存依赖主要用到的类就是CacheDependency、SqlCacheDependency、AggregateCacheDependency。

SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化( 行级别更改)或者SQL 查询结果的变化。

CacheDependency跟踪缓存依赖项,缓存依赖项可以是应用程序的 Cache 中的文件、目录或与其他对象的键。SqlCacheDependency类在所有受支持的 SQL Server 版本 (7.0, 2000, 2005) 上监视特定的 SQL Server 数据库表,以便在该表发生更改时,自动从 Cache 中删除与该表关联的项。 数据库表发生更改时,将自动删除缓存项,并向 Cache 中添加新版本的项。

AggregateCacheDependency 类监视依赖项对象的集合,以便在任何依赖项对象更改时,该缓存项都会自动移除。数组中的对象可以是CacheDependency 对象、SqlCacheDependency 对象、从 CacheDependency 派生的自定义对象或这些对象的任意组合。

AggregateCacheDependency 类与 CacheDependency 类的不同之处在于前者允许您将不同类型的多个依赖项与单个缓存项关联。例如,如果您创建一个从 SQL Server 数据库表和 XML 文件导入数据的页,则可创建一个 SqlCacheDependency 对象来表示数据库表的依赖项,以及一个 CacheDependency 来表XML 文件的依赖项。可创建 AggregateCacheDependency 类的一个实例,将每个依赖项添加到该类中,而不是为每个依赖项调用 Cache.Insert 方法。然后,可使用单个Insert 调用使该页依赖于 AggregateCacheDependency 实例。

下面就通过一个具体的例子让我们来感受一下在asp.net mvc5中使用缓存依赖和不使用缓存依赖我区别。

一、没有使用缓存依赖的例子

首先,用vs2013创建一个mvc5项目,本文使用nuget安装dapper来访问数据库。

HomeController.cs:

using System;
using System.Collections.Generic;
using System.linq;
using System.Web;
using System.Web.Mvc;
using Dapper;

namespace CacheDependency.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var r = HttpContext.Cache["employees"] as IEnumerable<Models.Employee>;
            if (r == null)
            {
                using (var conn = new System.Data.SqlClient.SqlConnection("Server=.;Database=Test1;uid=sa;pwd=sa"))
                {
                    conn.Open();
                    r = conn.Query<Models.Employee>("select * from Employee");
                    conn.Close();
                    HttpContext.Cache["employees"] = r;
                    ViewBag.DataFromMsg = "数据来源--DB";
                    return View(r);
                }

            }
            else
                ViewBag.DataFromMsg = "数据来源--HttpContext.Cache";
            return View(r);

        }
    }
}

Index对应的视图:

@model IEnumerable<CacheDependency.Models.Employee>
@{
    ViewBag.Title = "Home Page";
}
<h1>@ViewBag.DataFromMsg</h1>
<table>
    <tr>
        <th>EID</th>
        <th>NAME</th>
        <th>Age</th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>@item.EID</td>
            <td>@item.NAME</td>
            <td>@item.Age</td>
        </tr>
    }
</table>


第一次访问页面:

asp.net mvc5中使用缓存依赖SqlCacheDependency_第1张图片

刷新页面,再次访问页面:

asp.net mvc5中使用缓存依赖SqlCacheDependency_第2张图片

可以看到到当第二次访问页面的时候数据是走的缓存而没有从数据库中再次读数据。我们都知道当数据库中的数据有改动的时候,我们需要把原来缓存的数据清理掉,这要才能重新从数据库把数据读取出来并放到缓存中,这样才能保证显示到页面的数据是最新的。如果不使用缓存依赖,要保持源数据和缓存的中的数据一致,我们就要在后台为Employee表每添加、修改或删除一条数据的时候手动地把缓存删除。

  
  
  
  
  1. HttpContext.Cache["employees"]=null

这样虽然每次通过程序添加数据时能够删除缓存,但是这也一个问题。如果我们直接打开表Employee添加数据或者直接在查询分析器中insert数据,这时是删除不了缓存的,因为根本没有走我们的有删除缓存的程序。通过使用缓存依赖了,不仅可以决这个保持源数据和缓存的中的数据一致问题,还可以让我们的程序更加简洁,去除掉清缓存相关找代码。

二、使用缓存依赖的例子

2.1、修改HomeController代码

public ActionResult Index()
        {
            var r=HttpContext.Cache["employees"] as IEnumerable<Models.Employee>;
            if (r == null)
            {
                using (var conn = new System.Data.SqlClient.SqlConnection("Server=.;Database=Test1;uid=sa;pwd=sa"))
                {
                    conn.Open();
                    r = conn.Query<Models.Employee>("select * from Employee");
                    conn.Close();
                    HttpContext.Cache.Insert("employees", r, new System.Web.Caching.SqlCacheDependency("Test1", "Employee"));
                    ViewBag.DataFromMsg = "数据来源--DB";
                    return View(r);
                }            
            }
            else
                ViewBag.DataFromMsg = "数据来源--HttpContext.Cache";
            return View(r);
                
        }

2.2、修改Web.config

在connectionStrings配置结点下添加加入数据库信息:

  
  
  
  
  1. <add name="Test1" connectionString="Server=.;Database=Test1;uid=sa;pwd=sa" />
在<system.web>配置结点下添加缓存依赖的相关配置信息:
  
  
  
  
  1. <caching>
  2. <sqlCacheDependency enabled="true">
  3. <databases>
  4. <add name="Test1" pollTime="5000" connectionStringName="Test1" />
  5. </databases>
  6. </sqlCacheDependency>
  7. </caching>

2.3、启用sql server的数据库的数据缓存依赖功能

找到你的项目中Application_Start事件函数,并在最后加入下面的代码启用数据库的数据缓存依赖功能。

  
  
  
  
  1. var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Test1"].ToString();
  2. //启动数据库的数据缓存依赖功能
  3. SqlCacheDependencyAdmin.EnableNotifications(connectionString);
  4. //启用数据表缓存
  5. SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, "Employee");

2.4、测试结果

我们打开表Emplyee,为其添加一行数据。如下图:

asp.net mvc5中使用缓存依赖SqlCacheDependency_第3张图片

查看页面效果:

asp.net mvc5中使用缓存依赖SqlCacheDependency_第4张图片

刷新页面,再次访问:

asp.net mvc5中使用缓存依赖SqlCacheDependency_第5张图片

可以看到我们没有手动清理缓存,也使缓存自动刷新了。这就是缓存依赖带来的好处,但是使用缓存依赖也有限制:必须用ASP.Net和SQL Server开发应用,也就是SqlCacheDependency是基于微软的那套体制。

今天来演示一下在asp.net mvc5中怎么使用缓存依赖。

缓存是用来提高应用性能,降低服务器压力。适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存。使用缓存最麻烦的就是保持源数据和缓存的中的数据一致。

缓存(Cache)依赖,就是缓存是否更新依赖于其它Object。.net的缓存依赖主要用到的类就是CacheDependency、SqlCacheDependency、AggregateCacheDependency。

SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化( 行级别更改)或者SQL 查询结果的变化。

CacheDependency跟踪缓存依赖项,缓存依赖项可以是应用程序的 Cache 中的文件、目录或与其他对象的键。SqlCacheDependency类在所有受支持的 SQL Server 版本 (7.0, 2000, 2005) 上监视特定的 SQL Server 数据库表,以便在该表发生更改时,自动从 Cache 中删除与该表关联的项。 数据库表发生更改时,将自动删除缓存项,并向 Cache 中添加新版本的项。

AggregateCacheDependency 类监视依赖项对象的集合,以便在任何依赖项对象更改时,该缓存项都会自动移除。数组中的对象可以是CacheDependency 对象、SqlCacheDependency 对象、从 CacheDependency 派生的自定义对象或这些对象的任意组合。

AggregateCacheDependency 类与 CacheDependency 类的不同之处在于前者允许您将不同类型的多个依赖项与单个缓存项关联。例如,如果您创建一个从 SQL Server 数据库表和 XML 文件导入数据的页,则可创建一个 SqlCacheDependency 对象来表示数据库表的依赖项,以及一个 CacheDependency 来表XML 文件的依赖项。可创建 AggregateCacheDependency 类的一个实例,将每个依赖项添加到该类中,而不是为每个依赖项调用 Cache.Insert 方法。然后,可使用单个Insert 调用使该页依赖于 AggregateCacheDependency 实例。

下面就通过一个具体的例子让我们来感受一下在asp.net mvc5中使用缓存依赖和不使用缓存依赖我区别。

一、没有使用缓存依赖的例子

首先,用vs2013创建一个mvc5项目,本文使用nuget安装dapper来访问数据库。

HomeController.cs:
01.using System;
02.using System.Collections.Generic;
03.using System.linq;
04.using System.Web;
05.using System.Web.Mvc;
06.using Dapper;
07.
08.namespace CacheDependency.Controllers
09.{
10. public class HomeController : Controller
11. {
12. public ActionResult Index()
13. {
14. var r=HttpContext.Cache["employees"] as IEnumerable<Models.Employee>;
15. if (r == null)
16. {
17. using (var conn = new System.Data.SqlClient.SqlConnection("Server=.;Database=Test1;uid=sa;pwd=sa"))
18. {
19. conn.Open();
20. r = conn.Query<Models.Employee>("select * from Employee");
21. conn.Close();
22. HttpContext.Cache["employees"] = r;
23. ViewBag.DataFromMsg = "数据来源--DB";
24. return View(r);
25. }
26.
27. }
28. else
29. ViewBag.DataFromMsg = "数据来源--HttpContext.Cache";
30. return View(r);
31.
32. }
33. }
34.}

Index对应的视图: 01.@model IEnumerable<CacheDependency.Models.Employee>
02.@{
03. ViewBag.Title = "Home Page";
04.}
05.<h1>@ViewBag.DataFromMsg</h1>
06.<table>
07. <tr>
08. <th>EID</th>
09. <th>NAME</th>
10. <th>Age</th>
11. </tr>
12. @foreach (var item in Model)
13. {
14. <tr>
15. <td>@item.EID</td>
16. <td>@item.NAME</td>
17. <td>@item.Age</td>
18. </tr>
19. }
20.</table>


第一次访问页面:



刷新页面,再次访问页面:



可以看到到当第二次访问页面的时候数据是走的缓存而没有从数据库中再次读数据。我们都知道当数据库中的数据有改动的时候,我们需要把原来缓存的数据清理掉,这要才能重新从数据库把数据读取出来并放到缓存中,这样才能保证显示到页面的数据是最新的。如果不使用缓存依赖,要保持源数据和缓存的中的数据一致,我们就要在后台为Employee表每添加、修改或删除一条数据的时候手动地把缓存删除。
01.HttpContext.Cache["employees"]=null


这样虽然每次通过程序添加数据时能够删除缓存,但是这也一个问题。如果我们直接打开表Employee添加数据或者直接在查询分析器中insert数据,这时是删除不了缓存的,因为根本没有走我们的有删除缓存的程序。通过使用缓存依赖了,不仅可以决这个保持源数据和缓存的中的数据一致问题,还可以让我们的程序更加简洁,去除掉清缓存相关找代码。

二、使用缓存依赖的例子


2.1、修改HomeController代码
01.public ActionResult Index()
02. {
03. var r=HttpContext.Cache["employees"] as IEnumerable<Models.Employee>;
04. if (r == null)
05. {
06. using (var conn = new System.Data.SqlClient.SqlConnection("Server=.;Database=Test1;uid=sa;pwd=sa"))
07. {
08. conn.Open();
09. r = conn.Query<Models.Employee>("select * from Employee");
10. conn.Close();
11. HttpContext.Cache.Insert("employees", r, new System.Web.Caching.SqlCacheDependency("Test1", "Employee"));
12. ViewBag.DataFromMsg = "数据来源--DB";
13. return View(r);
14. }
15.
16. }
17. else
18. ViewBag.DataFromMsg = "数据来源--HttpContext.Cache";
19. return View(r);
20.
21. }


2.2、修改Web.config

在connectionStrings配置结点下添加加入数据库信息:
01.<add name="Test1" connectionString="Server=.;Database=Test1;uid=sa;pwd=sa" />

在<system.web>配置结点下添加缓存依赖的相关配置信息: 01.<caching>
02. <sqlCacheDependency enabled="true">
03. <databases>
04. <add name="Test1" pollTime="5000" connectionStringName="Test1" />
05. </databases>
06. </sqlCacheDependency>
07.</caching>


2.3、启用sql server的数据库的数据缓存依赖功能

找到你的项目中Application_Start事件函数,并在最后加入下面的代码启用数据库的数据缓存依赖功能。
01. var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Test1"].ToString();
02. //启动数据库的数据缓存依赖功能
03. SqlCacheDependencyAdmin.EnableNotifications(connectionString);
04. //启用数据表缓存
05. SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, "Employee");


2.4、测试结果

我们打开表Emplyee,为其添加一行数据。如下图:



查看页面效果:



刷新页面,再次访问:



可以看到我们没有手动清理缓存,也使缓存自动刷新了。这就是缓存依赖带来的好处,但是使用缓存依赖也有限制:必须用ASP.Net和SQL Server开发应用,也就是SqlCacheDependency是基于微软的那套体制。

文章转载自:蓝狐软件工作室 » asp.net mvc5中使用缓存依赖SqlCacheDependency


你可能感兴趣的:(asp.net mvc5中使用缓存依赖SqlCacheDependency)