ASP.NET MVC 数据库依赖缓存的实现

当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础。应用程序可以通过轮询获取数据变化的信息,使用轮询的话也不可能重新查一次后再和以前的数据做比较,如果这样的话如果我一个表里面有1000行数据我要是读100次的话是不是得比较1000 x 100 次,显然这种方法是不可行的,那怎么办呢?大家都学过触发器吧,实现数据库依赖缓存的轮询机制就是通过触发器来实现的。

实现步骤简单分析:
     首先创建一个用于记录监控信息的表,表的字段就两个一个是表名,一个是版本号。然后,对需要监控的变增加一个触发器,当表的内容发生变化的时候进行触发。我们可以用insert delete update 触发器,如果一旦触发以上动作就在把那个监控表的版本号字段加1。
  上面的步骤要我们自己动手实现起来很麻烦,但微软早就为我们提供好了一个工具叫Aspnet_regsql.exe 这个工具位于C:\Windows\Microsoft.NET\Framework\v4.0.30319这个路径下(也不一定但是一般就是这个路径)好了有工具了具体怎么用呢?打开cmd,输入以下命令行切换到aspnet_regsql.exe的运行根目录。

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

具体帮助请执行命令aspnet_regsql /? 查看下面列出本文要用到的参数

  • -S 服务器
  • -E 使用当前Windows凭据进行身份验证 
  • -U 用户名
  •   -P 密码
  •   -d 数据库名称,默认为aspnetdb数据库
  •   -ed 为数据库打开SQL缓存依赖支持
  •   -dd 关闭数据库的SQL缓存依赖支持
  •   -et 指定SQL缓存依赖使用的表,需要使用-t指定表名
  •   -dt 禁用SQL 缓存依赖使用的表,需要使用-t指定表名
  •   -t 指定表名
  •   -lt 列出启用缓存依赖的表名

然后就可以通过命令对数据库House启用Home表缓存依赖,具体命令如下:

aspnet_regsql -S . -E -ed -d House -et -t Home

运行后数据库会发生以下变化:

1. 增加了一个名称为AspNet_SqlCacheTablesForChangeNotification的表

2. Home表中增加了一个触发器

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [Home_AspNet_SqlCacheNotification_Trigger] ON [dbo].[Home]
                       FOR INSERT, UPDATE, DELETE AS BEGIN
                       SET NOCOUNT ON
                       EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N‘Home‘
                       END

3. 增加了几个存储过程  如下图所示:

打开AspNet_SqlCacheTablesForChangeNotification的表后会发现以下几个字段:

基本上和开始描述的步骤差不多,它这还多了一个有关时间的列,下面手动修改一个Home表中的数据看看这个监视表有什么变化。

结果 changeId 数值改变了!应用程序就是定期查询这个表的变化然后确定是否需要更新缓存。

数据库配置完毕后,在ASP.NET MVC项目中进行配置,打开Web.config在system.web 节点下加入以下代码:

<!-- 基于数据库的缓存依赖 -->
    <caching>
      <sqlCacheDependency enabled="true" pollTime="30000">
        <databases>
          <add name="pubs" connectionStringName="pubs" pollTime="500"/>
        </databases>
      </sqlCacheDependency>
    </caching>

其中 pollTime 属性就是应用程序间隔多长时间主动访问一次数据库默认为1分钟,最低为500ms,单位为ms。

在缓存类中根据需求修改以下核心代码:

                    SqlCacheDependency dependencies = string.IsNullOrEmpty(tableName) ? null : new SqlCacheDependency("PostCacheDependency", tableName);
                    if (cacheTime != 0)
                    {
                        caches.Insert(key, data, dependencies, DateTime.UtcNow.AddMinutes(cacheTime), Cache.NoSlidingExpiration);//System.Web.Caching.Cache.NoAbsoluteExpiration
                    }
                    else
                    {
                        caches.Insert(key, data, dependencies, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 20, 0));
                    }

absoluteExpiration:表示所插入对象将到期并被从缓存中移除的时间。 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 System.DateTime.UtcNow

而不是 System.DateTime.Now 作为此参数值。 如果使用绝对到期,则 slidingExpiration 参数必须为 System.Web.Caching.Cache.NoSlidingExpiration。

slidingExpiration:表示最后一次访问所插入对象时与该对象到期时之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。简单来说,就是自访问起的20分钟内不被访问就移除缓存。如果使用可调到期,则 absoluteExpiration 参数必须 System.Web.Caching.Cache.NoAbsoluteExpiration。

时间: 2024-10-03 17:12:09

ASP.NET MVC 数据库依赖缓存的实现的相关文章

007.ASP.NET MVC控制器依赖注入

原文链接:http://www.codeproject.com/Articles/560798/ASP-NET-MVC-Controller-Dependency-Injection-for-Be 前言:在这篇文章中,我将通过一个demo,直截了当地说明依赖注入在MVC框架中的使用. 内容列表: 1.介绍 2.为什么使用控制器依赖注入 3.控制器静态结构 4.自定义控制器 5.Framework中控制器的创建 6.为什么使用控制器工厂模式 7.控制器工厂模式 7.1.目标1 7.2.目标2 8.

ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用

上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在WebForm页面将主要采用属性注入的方式. 接下来我们正式进入主题,在上一章的基础上我们再添加一个web项目TianYa.DotNetShare.WebDemo,首先看我们的解决方案 本demo的web项目为ASP.NET Web 应用程序(.NET Framework 4.5) 空Web窗体,需要引用

如何在C#Asp.Net MVC使用Redis缓存

为什么要在Asp.Net MVC项目中使用Redis缓存呢?系统是按照高负载高并发来设计的,这就涉及服务器集群带来的问题,Session存储验证码或登录信息,在系统登录的时候,可能展示登录界面和存储验证码是一台服务器,登录验证的时候又是另外一个服务器,就会造成验证码找不到.重复登录等现象,所以必须系统公用的信息数据存储在一个地方,所有的服务器都从这个地方获取,这时我们就要用到Redis了,为什么要用Redis?Redis有什么优点?请自行度娘.下面我跟小伙伴们说说如何在C#Asp.Net MVC

Asp.net Mvc 数据库上下文初始化器

在Asp.net Mvc 和Entity FrameWork程序中,如果数据库不存在,EF默认的行为是新建一个数据库.如果模型类与已有的数据库不匹配的时候,会抛出一个异常. 通过指定数据库上下文对象初始化器,可以执行删除和重新创建数据库,并用种子方法填充数据库. 当Asp.net Mvc 应用程序每一次运行的时候,Entity Framework 能够自动创建(或者删除重新创建)数据库.你能够指定每一次程序运行的时候,或者模型与已有数据库不匹配的时候执行 删除重新创建操作,通过指定Seed 方法

使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面

Donut Caching是缓存除了部分内容以外的整个页面的最好的方式,在它出现之前,我们使用"输出缓存"来缓存整个页面. 何时使用Donut Caching 假设你有一个应用程序中有像"主页"这种页面,它除了用户登录的用户名以外总是给用户呈现相同的或者很少变化的内容.这时你可能需要缓存大部分的内容.加入你使用"输出缓存"并应用一个VaryByParam UserID来做缓存处理,那么整个页面会为每个访问用户生成缓存,但是这当我们有很大量的登陆用

【转】007.ASP.NET MVC控制器依赖注入

原文链接:http://www.codeproject.com/Articles/560798/ASP-NET-MVC-Controller-Dependency-Injection-for-Be 前言:在这篇文章中,我将通过一个demo,直截了当地说明依赖注入在MVC框架中的使用. 内容列表: 1.介绍 2.为什么使用控制器依赖注入 3.控制器静态结构 4.自定义控制器 5.Framework中控制器的创建 6.为什么使用控制器工厂模式 7.控制器工厂模式 7.1.目标1 7.2.目标2 8.

ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)

前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误导大家.. 今天这篇也不是讲Core的 前面写了C#开发移动应用系列  就第一篇和最后一篇上了最多推荐 - -  也许大家确实不看好吧.. 算了..废话不多说.开始今天的东西吧.. 本篇文章不讲为何我们要用IOC..只讲Autofac使用中的一些小心得 正文 1.基本注入 首先我们要构造一个容器,代码如下: //第一步: 构造一个Auto

ASP.NET MVC IOC依赖注入之Autofac系列开篇

Autofac为IOC组件,实现控制反转,主要结合面向接口编程,完成较大程度的解耦工作. 使用IOC,必须面向接口编程,所谓的面向接口编程,即程序中依赖于抽象,而不依赖于具体实现. 需要所有的业务逻辑尽量编写在服务层中,控制器层等不直接调用数据库上下文对象,如此,在一定程度上将各个操作层面区分开,更好的达到解耦的目的. 约定:控制器中不再调用数据库上下文对象,只在服务层中的具体实现调用. Autofac的生命周期可参考博文:https://blog.csdn.net/linshichen/art

ASP.NET MVC file download sample

ylbtech- ASP.NET MVC:ASP.NET MVC file download sample 功能描述:ASP.NET MVC file download sample 2,TechnologyAndTheEnvironment(技术与环境) 操作系统: windows 开发语言: C# 开发框架: ASP.NET MVC 数据库: 开发软件: Microsoft Visual Studio 2010  开发技术 ASP.NET MVC 3,DatabaseDesign(数据库设计