C#中缓存的简单方法及使用Sql设置缓存依赖项

概述

使用Cache高速缓存可以提高数据的读取速度,减少服务器与客户端之间的数据交互。因为Cache一经创建就会占用服务器上的资源,所以Cache并不是越多越好,一般用于数据较固定,使用较频繁的地方。

Cache类的简单使用方法

  1. 首先,我们需要引用命名空间System.Web.Caching;

  2. Cache类的方法主要提供对缓存数据的编辑操作,如增、删、改等。

在这里我们主要介绍Cache类的Add方法用于将数据添加到Cache对象

Add方法主要包含以下7个参数下:

  • 参数“key”代表缓存数据项的键值,必须是唯一的。

  • 参数“value”代表缓存数据的内容,可以是任意类型。

  • 参数“dependencies”表示缓存的依赖项,也就是此项的更改意味着缓存内容已经过期。如果没有依赖项,可将此值设置为NULL。

  • 参数“absoluteExpiration”是日期型数据,表示缓存过期的时间,.NET 2.0提供的缓存在过期后是可以使用的,能使用多长时间,就看这个参数的设置。

  • 参数“slidingExpiration”的类型表示一段时间间隔,表示缓存参数将在多长时间以后被删除,此参数与absoluteExpiration参数相关联。

  • 参数“priority”表示撤销缓存的优先值,此参数的值取自枚举变量“CacheItemPriority”,优先级低的数据项将先被删除。此参数主要用在缓存退出对象时。

  • 参数“onRemoveCallback”表示缓存删除数据对象时调用的事件,一般用做通知程序。

通过Add方法,我们可以像这样简单的创建一个Cache

Cache.Add(ID.ToString(), author, mydep, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.Normal, null);

当Cache[ID.ToString()]不为null时,我们就可以直接从缓存中读取数据。

  1. 如果想要删除创建的缓存,可以通过Remove方法移除缓存项
Cache.Remove(ID.ToString());

Sql缓存依赖类:SqlCacheDependency类

我们在上面提到了通过设置缓存依赖项可以检测缓存内容是否已经过期,一旦过期就应该及时更新。在这里我们使用SqlCacheDependency类来检测数据库的数据是否更新。

首先我们先来进行一些设置

  1. 打开Web.config配置文件,进行如下设置
<connectionStrings>
<add name="huxiu" connectionString="data source=(localdb)\v11.0;initial catalog=huxiu;integrated security=True;multipleactiveresultsets=True;" />
</connectionStrings>
 <system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="1000">
<databases>
<add name="huxiu" connectionStringName="huxiu" />
</databases>
</sqlCacheDependency>
</caching>

其中pollTime单位为毫秒,意思是每隔1秒检测下数据库,检测表是否有发生变化。connectionStringName应于上面connectionStrings中add name的名字相同。caching中的add name在后面创建缓存依赖项的时候会使用到。

  1. 通过命令行启动数据库缓存依赖项

在C:\Windows\Microsoft.NET\Framework\v4.0.30319 aspnet_regsql.exe 盘中找到aspnet_regsql.exe位于的目录,使用cmd命令行打开该目录

在该目录下输入

aspnet_regsql -C "data source=(localdb)\v11.0;initial catalog=huxiu;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot" -ed -et -t "dbo.Author"

其中-c后面为数据库连接字符串,-t后面为数据库中表的名称

然后,继续在该目录下输入如下代码

以下这步不知道和上面的设置有没有重复,如果出现VS中报错无法连接到SQL 数据库进行缓存依赖项轮询可以尝试继续进行以下设置,没有则可以跳过。

aspnet_regsql -S (localdb)\v11.0 -E -d dbname -ed
aspnet_regsql -S (localdb)\v11.0 -E -d dbname -t dbtable -et

其中dbname为数据库名称,dbtable为数据库中表的名称

  1. 创建缓存依赖项

使用以下代码创建缓存依赖项

SqlCacheDependency mydep = new SqlCacheDependency("huxiu","Author");

其中的两个参数分别为caching中的add name的名字和数据库中表的名字

通过以上的步骤,我们就可以实现当数据库被更改时通过SqlCacheDependency的HasChanged方法进行判断,从而对缓存数据进行更新。

Aspnet_regsql.exe命令行有如下选项:
以下只选取了比较常用的几个命令项,详细可参考这里
1.SQL连接选项

 -E      使用当前登录用户的 Windows 凭据进行身份验证;
 -S      指定正在运行 SQL Server 并且将安装或者已安装数据库的计算机的名称;
 -U      要用来登录的 SQL Server 用户 ID。此选项还要求使用密码 (-P) 选项。如果要使用 Windows 凭据 (-E) 进行身份验证,则此选项不是必需的;
 -P      要用来登录的 SQL Server 密码。此选项还要求使用用户 ID (-U) 选项。如果要使用 Windows 凭据 (-E) 进行身份验证,则此选项不是必需的
 -C      指定要连接到正在运行 SQL Server 并且将安装或者已经安装数据库的计算机的连接字符串。如果您仅指定服务器 (-S) 和登录(-U 和 -P,或 -E)信  息,则此选项不是必需的

2.应用程序服务选项

 -A     添加对一项或多项 ASP.NET 应用程序服务的支持。可以同时或单独指定服务标识符。下列标识符用于 ASP.NET 应用程序服务。
                  all -- 所有的服务,包括由服务共享的通用表和存储过
                  m -- 成员资格
                  r -- 角色管理器
                  p -- 配置文件
                  c -- Web 部件个性化设置

当然,对应的-R就是移除这些应用程序服务了。
3.SQL依赖缓存依赖项

-ed      为 SQL 缓存依赖项启用数据库
-dd      为 SQL 缓存依赖项禁用数据库
-et      为 SQL 缓存依赖项启用表。在参数字符串中还必须包括 -t 选项
-dt      为 SQL 缓存依赖项禁用表。在参数字符串中还必须包括 -t 选项
-t        指定要启用或禁用以便与 SQL 缓存依赖项一起使用的表名。此选项必须与 -et 或 -dt 选项一起使用

下面就是个具体的例子:
1.为已经建好的数据库名为NBAData创建成员资格提供程序服务(如果输入的数据库名称不存在或没写,则会创建一个新数据库或创建一个默认的aspnetdb数据库),这里,登陆为sqlserver身份验证,用的是Visual Studio 2008命令提示工具:

aspnet_regsql.exe -S localhost -U sa -P P@ssw0rd -d NBAData -A m

2.为数据库NBAData里的一张表Player启用缓存依赖,若数据库未启用缓存依赖,则先要输入命令-ed为数据库启用缓存依赖:

aspnet_regsql.exe -S localhost -U sa -P P@ssw0rd -d NBAData -ed -et -t Player
aspnet_regsql.exe -S localhost -E -ssadd -sstype c -d yourDbName
 

当缓存依赖添加成功后数据库中则会添加一张名为AspNet_SqlCacheTablesForChangeNotification的表,并且有一行记录存在。

上一篇:EChart 文字大小调整 饼状图为例


下一篇:python命令行神器Click