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

缓存是为此来提升利用性,降低服务器压力。适用于数不易变,数据好通用的面貌,
对于动态查询数据,例如数据解析,最好屏弃采取缓存。使用缓存最劳顿的就是是保持源数据和缓存的面临之多少一致。

缓存(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:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using Dapper;
    1. namespace CacheDependency.Controllers
  7. {
  8. publicclassHomeController:Controller
  9. {
  10. publicActionResultIndex()
  11. {
  12. var r=HttpContext.Cache[“employees”]asIEnumerable<Models.Employee>;
  13. if(r ==null)
  14. {
  15. using (var conn =newSystem.Data.SqlClient.SqlConnection(“Server=.;Database=Test1;uid=sa;pwd=sa”))
  16. {
  17. conn.Open();
  18. r = conn.Query<Models.Employee>(“select * from Employee”);
  19. conn.Close();
  20. HttpContext.Cache[“employees”]= r;
  21. ViewBag.DataFromMsg=”数据来–DB”;
  22. returnView(r);
  23. }
    1. }
  24. else
  25. ViewBag.DataFromMsg=”数据来自–HttpContext.Cache”;
  26. returnView(r);
    1. }
  27. }
  28. }

Index对应的视图:

  1. @modelIEnumerable<CacheDependency.Models.Employee>
  2. @{
  3. ViewBag.Title=”Home Page”;
  4. }
  5. <h1>@ViewBag.DataFromMsg</h1>
  6. <table>
  7. <tr>
  8. <th>EID</th>
  9. <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>

先是次等看页面:

图片 1

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

图片 2

得视到当第二潮走访页面的时刻数据是动之复苏存如尚未于数据库被更读数据。我们还明白当数据库中之数目有改变的时,大家用拿本缓存的数码清理掉,这假如才可以更打数据库把多少读取出来并措缓存中,这样才可以担保呈现到页面的数据是行的。假诺不利用缓存倚重,要保源数据与缓存的遭受之数目一致,大家就是设当后台为Employee表每增长、修改或去一久数的时手动地将缓存删除。

  1. HttpContext.Cache[“employees”]=null

然虽然每一遍经过序添加数据通常可以去缓存,可是就也一个问题。如若大家一贯打开表Employee添加数据或者直接在询问分析器中insert数据,这时是去除不了缓存的,因为向没有挪动我们的暴发剔缓存的顺序。通过动用缓存依赖了,不仅可决这么些保持源数据和缓存的丁的数额一致问题,还好给咱的次序更加从简,去解清缓存相关搜索代码。

老二、使用缓存看重之事例

2.1、修改HomeController代码

  1. publicActionResultIndex()
  2. {
  3. var r=HttpContext.Cache[“employees”]asIEnumerable<Models.Employee>;
  4. if(r ==null)
  5. {
  6. using (var conn =newSystem.Data.SqlClient.SqlConnection(“Server=.;Database=Test1;uid=sa;pwd=sa”))
  7. {
  8. conn.Open();
  9. r = conn.Query<Models.Employee>(“select * from Employee”);
  10. conn.Close();
  11. HttpContext.Cache.Insert(“employees”, r,newSystem.Web.Caching.SqlCacheDependency(“Test1″,”Employee”));
  12. ViewBag.DataFromMsg=”数据出自–DB”;
  13. returnView(r);
  14. }
    1. }
  15. else
  16. ViewBag.DataFromMsg=”数据来–HttpContext.Cache”;
  17. returnView(r);
    1. }

2.2、修改Web.config

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

  1. <addname=”Test1″connectionString=”Server=.;Database=Test1;uid=sa;pwd=sa”/>

在<system.web>配置结点下加加缓存看重之连带部署音讯:

  1. <caching>
  2. <sqlCacheDependencyenabled=”true”>
  3. <databases>
  4. <addname=”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,为其增长一行数。如下图:

图片 3

查页面效果:

图片 4

刷新页面,再一次走访:

图片 5

足见见我们并未手动清理缓存,也假使缓存自动刷新了。那就是缓存看重带来的利,然则接纳缓存倚重也闹限定:必须用ASP.Net和SQL
Server开发以,也便是SqlCacheDependency是按照微软的这套体制。

 

前几日大家来研讨竟它是什么样促成之。

无异于、表底生成

图片 6

直达图能够望多矣一个表AspNet_SqlCacheTablesForChangeNotification,其表表结构与数量如下图:

图片 7

第二、Employee表触发器

图片 8

后来成了一个触发器名吧Employee_AspNet_SqlCacheNotification_Trigger,其情节如下:

  1. CREATE TRIGGER [dbo].[Employee_AspNet_SqlCacheNotification_Trigger] ON [dbo].[Employee]
    1. FOR INSERT, UPDATE, DELETE AS BEGIN
  2. SET NOCOUNT ON
  3. EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N’Employee’
  4. END

方触发器的图是当于表Employee做插入、修改、删除操作的当儿实施一个叫作也dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure的存储过程,这些蕴藏过程为是咱打开sql
server的缓存倚重自动生成的,总的变化了储存过程要下图:

图片 9

脚我们打开中的dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure:

  1. Create PROCEDURE [dbo].[AspNet_SqlCacheUpdateChangeIdStoredProcedure]
  2. @tableName NVARCHAR(450)
  3. AS
    1. BEGIN
  4. UPDATE dbo.AspNet_SqlCacheTablesForChangeNotification WITH (ROWLOCK) SET changeId = changeId +1
  5. WHERE tableName
    =@tableName
  6. END

三、总结

图片 10

当sql
server启用缓存倚重之后,就会面在相应的数据库添加相应的申、触发器和有些储存过程。它是运用触发器来监测表的数码的转,如若有长、删、改便栽数据及通报表,然后公告订阅者通知的网站失缓存失效。

图片 11

相关文章