zoukankan      html  css  js  c++  java
  • 缓存记录

     

            #region ¤¦Ì?oä?广??À¨ª

            /// <summary>

            /// ¤¦Ì?oä?广??À¨ª

            /// </summary>

            /// <returns></returns>

            public static DataTable GetAdTable()

            {

     

               //CacheHelper.ClearCache();

     

                DataTable dt = null;

     

                string keyName = "Advert";

     

                dt = (DataTable)CacheHelper.GetCache(keyName);

     

                if (null==dt)

                    {

                        dt = db.GetTable("SELECT AdID,AID,AdTarget,AdWidth,AdHeight,AdNum,AdDes,ADType FROM [dbo].[Advert]");

     

                        CacheHelper.AddCache(keyName, dt);

                    }

                 

                

               

                   

     

                    return dt;

               

            }

     

            #endregion

     

     

     

            #region ¤¦Ì?°??广???Ì??¤?¨¤®|?¡é

            /// <summary>

            /// ¤¦Ì?°??广???Ì??¤?¨¤®|?¡é

            /// </summary>

            /// <param name="Aid">广???ID</param>

            /// <returns>°??广????¨®</returns>

            public static AdvertModel GetAdModel(int Aid)

            {

     

                AdvertModel tmpModel = null;

     

               

     

                try

                {

     

     

     

     

     

                    DataRow dr = GetAdTable().Select("AID="+Aid)[0];

     

                    if (dr != null)

                    {

                        tmpModel = new AdvertModel();

                        tmpModel.AdID = DBNull.Value.Equals(dr["AdID"]) ? 0 : (int)dr["AdID"];

                        tmpModel.AdHeight = DBNull.Value.Equals(dr["AdHeight"]) ? 0 : (int)dr["AdHeight"];

                        tmpModel.AdNum = DBNull.Value.Equals(dr["AdNum"]) ? 0 : (int)dr["AdNum"];

                        tmpModel.AdTarget = DBNull.Value.Equals(dr["AdTarget"]) ? "_bank" : dr["AdTarget"].ToString();

                        tmpModel.AdWidth = DBNull.Value.Equals(dr["AdWidth"]) ? 0 : (int)dr["AdWidth"];

                        tmpModel.ADType = DBNull.Value.Equals(dr["ADType"]) ? 0 : (int)dr["ADType"];

                    }

                }

                catch (Exception e)

                {

     

                }

              

     

     

                return tmpModel;

     

     

     

            }

            #endregion

     

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Web.Caching;

    using System.Web;

     

    namespace Pad.Common

    {

       public class CacheHelper

        {

     

          // private static CacheItemRemovedCallback callback = new CacheItemRemovedCallback(CacheItemCallBack);

     

     

     

           public static AggregateCacheDependency GetDependency(string dependencyKey)

           {

               AggregateCacheDependency dependency = new AggregateCacheDependency();

               string[] tables = System.Configuration.ConfigurationManager.AppSettings[dependencyKey].Split('-');

               foreach (string table in tables)

               {

                   dependency.Add(new SqlCacheDependency("mypads", table));

     

               }

     

               return dependency;

           }

     

     

     

           /// <summary>

           /// ¨¹¦ÌÀ¨ª

           /// </summary>

           public static List<string> cacheKeyList = new List<string>();

     

     

     

           /// <summary>

           /// ®¨¦¨¹¦Ì¤¦Ì?oä??¨®

           /// </summary>

           /// <param name="keyName">¨¹¦Ì</param>

           /// <returns>oä??¨®</returns>

           public static object GetCache(string keyName)

           {

               if (string.IsNullOrEmpty(keyName)) return null;

               return HttpRuntime.Cache.Get(keyName);

           }

     

     

                 //<summary>

                 // oä??¨®

                //</summary>

                 //       <param name="keyName">¨¹¦Ì</param>

                 //<param name="value">?¨®</param>

                 //<param name="dependency">°¨¤¤¦Ì¡¥?</param>

           public static void AddCache(string keyName, object value,AggregateCacheDependency dependency)

           {

     

               if (string.IsNullOrEmpty(keyName) || null == value) return;

     

               if (!cacheKeyList.Contains(keyName)) cacheKeyList.Add(keyName);

     

               HttpRuntime.Cache.Add(keyName, value, dependency, DateTime.Now, TimeSpan.Zero, CacheItemPriority.Normal,null);

           }

     

     

           /// <summary>

           ///   oä??¨®

           /// </summary>

           /// <param name="keyName">¨¹¦Ì</param>

           /// <param name="value">?¨®</param>

           /// <param name="dependency">°¨¤¤¦Ì¡¥?</param>

           public static void AddCache(string keyName, object value)

           {

     

     

               if (string.IsNullOrEmpty(keyName) || null == value) return;

     

               if (!cacheKeyList.Contains(keyName)) cacheKeyList.Add(keyName);

     

               SqlCacheDependency sqlDependency =null;

     

               string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString;

     

     

               try

               {

                   sqlDependency = new SqlCacheDependency("mypads", keyName);

               }

               catch (DatabaseNotEnabledForNotificationException ex)

               {

     

                   Logs("A¡é"+ex.ToString()+ex.Message);

     

                   try

                   {

                        //string connStr = @"Data Source=tangself\SQLEXPRESS;Initial Catalog=pads;Integrated Security=SSPI";

     

                       SqlCacheDependencyAdmin.EnableNotifications(connStr);

                   }

                   catch ( UnauthorizedAccessException e)

                   {

     

                       Logs("B¡é" + e.ToString() + e.Message);

                   }

               }

               catch (TableNotEnabledForNotificationException ec)

               {

     

                   Logs("C¡é" + ec.ToString() + ec.Message);

     

                   try

                   {

                       //string connStr = @"Data Source=tangself\SQLEXPRESS;Initial Catalog=pads;Integrated Security=SSPI";

                       SqlCacheDependencyAdmin.EnableTableForNotifications(connStr, keyName);

     

                   }

     

                   catch (System.Data.SqlClient.SqlException ex)

                   {

     

                       Logs("D¡é" + ex.ToString() + ex.Message);

     

                   }

     

               }

     

               finally

               {

     

                   HttpRuntime.Cache.Add(keyName, value, sqlDependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

     

     

               }

     

     

     

     

              

     

           }

     

     

           /// <summary>

           /// °?¨£¤oä??¨®

           /// </summary>

           /// <param name="keyName">¨¹¦Ì</param>

           public static void RemoveCache(string keyName)

           {

               if (cacheKeyList.Contains(keyName)) cacheKeyList.Remove(keyName);

               HttpContext.Current.Cache.Remove(keyName);

           }

     

     

           /// <summary>

           /// ?yoä?

           /// </summary>

           public static void ClearCache()

           {

               foreach (string keyName in cacheKeyList)

               {

                   HttpContext.Current.Cache.Remove(keyName);

     

                  

               }

     

               cacheKeyList.Clear();

           }

     

           public static void Logs(string res)

           {

              

               string path = AppDomain.CurrentDomain.BaseDirectory+ "\\logs.txt";

               if (!System.IO.File.Exists(path))

               {

                   System.IO.File.Create(path);

               }

     

               // System.Web.HttpContext.Current.Response.Write("aaaaaaaaaa");

     

               System.IO.FileStream fs = System.IO.File.Open(path,System.IO.FileMode.Append);

     

     

               byte[] str = System.Text.UnicodeEncoding.GetEncoding("db2312").GetBytes(DateTime.Now.ToString() + "\r\n" + res + "\r\n");

     

               fs.Write(str, 0,str.Length);

     

               fs.Close();

     

              // //res.ToString();

     

           }

        }

    }

     

    SqlCacheDependency数据库缓存依赖。

    实现步骤:

        下面就让我们看一下如何实现数据库缓存依赖功能:

    第一步: 修改web.config,让项目启用SqlCacheDependency

    将下列代码加入web.config<system.web>节:        

            <caching><sqlCacheDependency enabled="true" pollTime="6000">

                    <databases><add name="codematic" connectionStringName="strcodematic" /></databases>

               </sqlCacheDependency></caching>

    这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字,这个名字将在第3步中用到。
    SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。

    注意:在<databases>节的<add name="codematic" connectionStringName="strcodematic" />中的name属性值必须System.Web.Caching.SqlCacheDependency("codematic", "P_Product"); 中的第一个参数(数据库名称)相一致。
    第三步:在代码中使用缓存,并为其设置SqlCacheDependency依赖:

       

    public static object GetCache(string CacheKey){

        System.Web.Caching.Cache objCache = HttpRuntime.Cache;

        return objCache[CacheKey];

    }

    public static void SetCache(string CacheKey, object objObject, CacheDependency dep){

        System.Web.Caching.Cache objCache = HttpRuntime.Cache;

        objCache.Insert(CacheKey,objObject,dep,Cache.NoAbsoluteExpiration,

           Cache.NoSlidingExpiration, CacheItemPriority.Default,null);

    }

    protected void Page_Load(object sender, EventArgs e){

        string CacheKey = "cachetest";

        object objModel = GetCache(CacheKey);//从缓存中获取

        if (objModel == null){

            objModel = GetData();//把当前时间进行缓存

            if (objModel != null){

              SqlCacheDependency dep = new SqlCacheDependency("codematic", "P_Product");

                SetCache(CacheKey, objModel, dep);//写入缓存

    }

    //查询数据

    private DataSet GetData(){}

         从以上代码可以看出,和文件依赖基本相同,只是在存放缓存SetCache时存入的依赖对象不同罢了。这里用的是SqlCacheDependency。其中,创建SqlCacheDependency的构造方法:

    public SqlCacheDependency (string databaseEntryName,string tableName)

    databaseEntryName :是在Web.config 文件的 caching 节的 sqlCacheDependency databases 元素中定义的数据库的名称。

      tableName :与 SqlCacheDependency 关联的数据库表的名称。

        这样,只有当P_Product表的内容发生变化时,查询操作才会重新查询数据更新缓存的内容,可以大大减少数据库的重复查询和提高系统的性能和运行效率。

    采用SQLServer2005 BrokerSqlDependency类来提供数据更改通知(原创)

           SQLServer2005中,SQL Server Service Broker 用于创建会话以交换消息。 消息交换在目标和发起方这两端之间进行。

           使用 SqlDependency 订阅查询通知是直接的:SqlDependency 对象将管理数据库中设置通知涉及到的复杂性。建立通知后,对象便会监视实现通知的基础数据库对象,当 SQL Server 创建查询通知时,将在应用程序中调用事件处理程序。

           对于应用程序接收SQL Server Service Broker通知,只能获取到对应数据库表数据做了何种更新,而无法获取更新的数据,而我们却可以利用这个通知,来做缓存依赖,来达到缓存过期的目的。

           使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀),

    例如:select * from table1select column1 from table1select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。

           以下以一个实际的例子(sqlDep项目)来说明如何使用ServerBrokerSqlDependency类来做缓存依赖,充分利用服务器资源和提高应用程序性能,并且封装以提供给开发人员最大的便利性,我们需要按照如下步骤操作:

    1.     首先要在使用的数据库执行 ALTER DATABASE AdventureWorks SET ENABLE_BROKER 以启用该功能,执行时必须关闭所有可能锁表的操作和作业。

    2.     打开sqlDep示例,运行ServiceBrokerTest.aspx以查看结果,查看代码。

    3.     在现有应用程序中增加更改通知以及缓存机制。

    a)      webconfig<configuration>节中添加<connectionStrings>节,并配置连接字符串。

    b)      webconfig<system.web>节中添加

    <caching>

    <cache percentagePhysicalMemoryUsedLimit="60" privateBytesPollTime="00:05:00" />

    </caching> (此项配置全局缓存设置,可选)

    c)      建立数据访问层,如何封装编写不限,只要具有返回数据的方法即可。

    d)      嵌入或者重写DaBase.cs中的protected virtual DataTable GetDataTable方法,具体请参考sqlDep示例,该方法提供自动响应程序表发生的更改,自动设定缓存机制,封装此方法后,对于开发人员,只需要按照以往开发习惯提供任意sql语句编写程序获取数据。

    e)      继承DaBase类或自己编写具有protected virtual DataTable GetDataTable方法的类,并调用该方法,参见DaDimCustomer.cs

    以下我们以sqlDep做测试,以验证可行性及其性能:

    我们以SqlServer2005自带的AdventureWorksDW数据库中的DimCustomer表为例,该表有29列,各种数据类型都有,18484行,7984KB数据,平均每行0.43KB

    我们以每次查询20页,查询该表的所有列作为测试。由于缓存的是查询结果,所以内存变化可以根据每次查询的数据量为基准,20行大小大约是8.6KB,缓存默认设置是允许使用服务器内存的90%

    假设对应的数据库表不做更新操作,假设Web服务器有1G的内存可使用缓存,

    则可以缓存12万份不重复结果(这里没有计算.net本身每个数据实体,每个缓存相关数据所占有的空间,相对于数据而言可以忽略不计)

    缓存命中率大都集中在常用查询,例如商品列表第一页,某个商品分类第一页等,一旦有某个用户使用了查询,则其他用户可以不需要访问数据库即可得到所需数据。即使缓存如果超过了程序规定的最大数据,.net运行时也会自动随即清空缓存,这并不影响程序运行。

          SQL Server 2005上执行

    ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency特性。

    3.编写global.asax文件,启动监听sql2005通知事件.

    Application_Start 中:

    string connStr =System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

                System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(connStr);

                string[] tables = System.Configuration.ConfigurationManager.AppSettings["CacheTables"].Split('-');

                foreach (string table in tables){

                    System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(connStr, table);

                }

                System.Data.SqlClient.SqlDependency.Start(connStr);


     void Application_End(object sender, EventArgs e){         

    System.Data.SqlClient.SqlDependency.Stop(System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);

            }

    4.编写数据访问代码.创建一个EmployeeData的类,代码如下

     public class EmployeeData{ 

         private HttpContext context;

         public DataSet GetCacheData(){

             context = HttpContext.Current;

             DataSet cache =(DataSet) context.Cache["employee"];

             if (cache == null){return GetData();}

             else{return cache;}

         }

         public DataSet GetData(){

            

             adp.Fill(ds);

             context.Cache.Add("employee", ds, dep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, new CacheItemRemovedCallback(this.DataDiff));

             return ds;

         }

         public void DataDiff(string key, object value, CacheItemRemovedReason reason){

             Console.WriteLine("key:" + key);

             GetData();

         }

     }

    这里需要注意的是 select语句的写法, 不能使用 select *  的方式,一定要在表名前加架构名称 如我们这里的 dbo.employee.

    SQL SERVER 7.0/2000/2005版本

    正文

    一、SQL SERVER 7.0/2000SQL SERVER 2005的简介及比较

    1.1 SQL SERVER 7.0/2000

    SQL SERVER 7.0/2000没有提供内置的支持数据缓存依赖的功能,所以只能通过采用添加特定数据库表、触发器等方式,通过后台不断轮询数据库来检查数据更改。当在数据表上执行INSERTUPDATE DELETE操作时将自动发出更改通知,所以只能监测到表级,具体到哪一行是没法跟踪的。

    使用方法步骤:

    1.1.1 使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库。

    1.1.1.1 ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;

    aspnet_regsql -S <server> -U sa -P sa -d <database> -ed 启动数据库的数据缓存依赖功能

    aspnet_regsql -S <server> -U sa -P sa -d <database> -t <table> -et 启动数据表的数据缓存依赖功能

    1.1.1.2

    SqlCacheDependencyAdmin.EnableNotifications(connectionString); //启动数据库的数据缓存依赖功能

    SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString,table); //启用数据表缓存

    推荐这段代码写在Global.asaxApplication_Start方法中,以便应用程序启动的时候就启用数据库和数据表的缓存依赖功能。

    1.1.2 配置Web.config

    <sqlCacheDependency enabled="true" pollTime="10000">配置在<sytem.web>下的<caching>结点下,只有一个数据库的话不必指定下一级<database>结点

    1.1.3 应用程序数据缓存中使用(还可以在数据源控件、输出缓存整个页面时使用,这里就不介绍了,下同)

    SqlCacheDependency scd = new SqlCacheDependency("数据库名称","表名");

    Cache.Insert(...,scd,...);

    1.2 SQL SERVER 2005

    内置支持SQL数据缓存依赖,内置通知传递服务,能够提供更小粒度的数据更改监测,使用和配置简单。

    使用方法步骤:

    1.2.1 检测是否已经启用Service Broker

    Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled') -- 1 表示已经启用 0 表示没有启用

    这个地方我看有些朋友翻译的成“是否能启用”,这是不对的,这里我把英文原文帖出来:“This can be checked by calling "Select databasepropertyex('db Name', 'IsBrokerEnabled')". A '1' means that the broker is enabled. A '0' means that the broker is not enabled. ”。

    依据我的经验,如果直接在当前SqlServer2005上新建一个数据库的话,默认是打开的,如果是从其他地方数据库导过来的,导入之后默认关闭了。(可能有不准确,大家可以自己试验一下测试一下)。如果已经打开可直接调到1.2.2

    1.2.1.1 启用Service Broker

    ALTER DATABASE 数据库名称 SET ENABLE_BROKER;

    2009-5-26补充: 如果执行此语句超过10秒或处于假死状态,请重启数据库,什么都别做先执行这个语句就行了!

    1.2.2 在实现基于服务的SQL数据缓存依赖过程中,需要显式调用SqlDependency.Start来启动接受依赖项更改通知的侦听器。

    SqlDependency.Start(connectionString); //推荐将这段代码加到Global.asaxApplication_Start方法中,

    SqlDependency.Stop(connectionString); //用于关闭,可加在Global.asaxApplication_End方法中。

    1.2.3 应用程序数据缓存中使用

    SqlCommand cmd = new SqlCommand(sql,conn);

    SqlCacheDependency scd = new SqlCacheDependency(cmd);

    Cache.Insert(...,scd,...);

    注意:

    a). 必须设置完全限定名称的数据表。即表名前面需要加所有者,如dbo.test

    b). 必须明确设置所访问数据库列名称,不能使用“*”。

    c). 必须保证不是聚合函数。如COUNTMAX等。

    1.3 比较、区别

    SQL SERVER 7.0/2000

    SQL SERVER 2005

    实现机制

    轮询

    通知传递服务(Service Broker)

    是否需要配置启用

    需要

    不需要,内置支持

    数据更改检测

    限于表级更改监测

    表级、行级更改监测

    并且很明显,SQL SERVER 2005的缓存机制更加高效。另外,SqlCacheDependency类还特别结合SQL SERVER 2005 进行了优化:

    a). 使用SQL SERVER 2005 时,SqlCacheDependency类支持与System.Data.SqlClient.SqlDependency类进行集成。应用程序可创建SqlDependency对象,并通过OnChanged事件处理程序接受通知进行注册。这样,应用程序不仅可以使用Sql server 2005的查询通知机制来监测使用SQL查询结果无效的数据更改,并将缓存对象从缓存中移除,而且还可以轻松获取数据更改通知,以便刷新缓存。(从这里可以看出,当触发onRemoveCallback委托的时候,数据已经从缓存里面删除了,这样一来可以手动在委托里面添加缓存,或者干脆设置成null,让他下次调用的时候再缓存。)

    b). 不仅向应用程序添加缓存依赖项,还可以与@OutputCache指令一起使用,以生成依赖于SqlServer数据库表的输出缓存的页面或用户控件。对于用户控件,@OutputCache指令不支持使用SQL SERVER 2005 的查询通知(onRemoveCallback委托)

    二、System.Web.Caching.Cache InsertAdd区别

    2.1 Add方法

    object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

    2.2 Insert方法

    void Insert(string key, object value);

    void Insert(string key, object value, CacheDependency dependencies);

    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);

    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);

    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

    2.3 比较、区别

    a). Insert方法支持5种重载,使用灵活,而Add方法必须提供7个参数;

    b). Add方法可以返回缓存项的数据对象,Insert 返回Void

    c). 添加重复缓存情况下,Insert会替换该项,而Add方法会报错。

    三、 CacheDependencyAggregateCacheDependencySqlCacheDependency

    3.1 CacheDependencyAggregateCacheDependencySqlCacheDependency的父类。主要用于在应用程序数据缓存对象与文件、缓存键、文件或缓存键的数组或另外一个CacheDependency对象之间建立依赖关系。CacheDependency监视依赖关系比便在任何对象更改时自动移除缓存对象。CacheDependency可以监测一组(到文件或目录的)文件路径的更改情况。

    3.2 AggregateCacheDependency主要用于实现聚合缓存依赖。如一笔数据同时对两个表进行缓存依赖,一旦其中任何一个表数据更改缓存将失效。

    3.3 SqlCacheDependency将应用程序数据缓存对象、页面输出缓存、数据源控件等与指定SQL Server数据库表或Sql Server 2005 查询结果之间建立缓存依赖关系,在表发生更改(Sql Server 2005 行级别更改)时,自动从缓存中删除和重新添加与该表关联的缓存对象。一般而言:

    SqlCacheDependency (SqlCommand) 用于SQL SERVER 2005

    SqlCacheDependency (数据库名, 表名) 用于SQL SERVER 7.0/2000

    使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀),

    例如:select * from table1select column1 from table1select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。


    使用步骤

    为数据库开启SqlCacheDependency功能

    方法1:使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库。

    aspnet_regsql -S SQL服务器名 -E -d 数据库 -ed      启动数据库的数据缓存依赖功能

    我们还需要对相关的数据表执行aspnet_regsql命令,如:
    aspnet_regsql -S SQL服务器名 -E -d 数据库 -t 表名 -et 多个表就多次执行这句话

    方法2

    SqlCacheDependencyAdmin.EnableNotifications(connectionString);      //启动数据库的数据缓存依赖功能                    

    SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table);         //启用数据表缓存

    推荐这段代码写在Global.asaxApplication_Start方法中,以便应用程序启动的时候就启用数据库和数据表的缓存依赖功能。

    配置Web.config

    <!--缓存配置-->
          <caching>
          <!--pollTime为查询数据库是否变动的间隔时间,毫秒单位-->
              <sqlCacheDependency enabled="true" pollTime="10000">
                  <databases>
                      <add name="数据库名" connectionStringName="Webconfig的连接字符串key" pollTime="10000"/>
                  </databases>
              </sqlCacheDependency>
          </caching>

    编码实现

    缓存操作类:

            /// <summary>
            /// 获取所有相关配置并对应添加CacheDependency对象
            /// </summary>
            /// <param name="configKey">指定需要使用Cache的数据库表名的Webconfig's key</param>
            /// <returns></returns>
            public static AggregateCacheDependency GetDepandency(string configKey)
            {
                AggregateCacheDependency dependency = new AggregateCacheDependency();
                string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
                string tableConfig = ConfigurationManager.AppSettings[configKey];
                string[] tables = tableConfig.Split(',');
                foreach (string tableName in tables)
                    dependency.Add(new SqlCacheDependency(dbName, tableName));
                return dependency;
            }

    缓存业务类:

        /// <summary>
        /// 友情链接SqlCacheDependency
        /// </summary>
        public class LinksProxy
        {
            /// <summary>
            /// 设置缓存持续时间
            /// </summary>
            private static readonly int CacheTimeout = int.Parse(ConfigurationManager.AppSettings["LinksCacheDuration"]);
            /// <summary>
            /// 是否开启缓存
            /// </summary>
            private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);

            /// <summary>
            /// 获取全部友情链接
            /// </summary>
            public static IList<LinksInfo> GetLinks()
            {
                //如果不开启缓存则直接调用DAL方法执行常规操作
                if (!enableCaching)
                    return LinksDAL.SelectLinks();
                else //开启缓存
                {
                    //设置缓存key,这个最好根据查询条件来设置,这样可以缓存同一条件的数据
                    string key = "Links_by_search_all";
                    //读取缓存中的数据
                    IList<LinksInfo> data = (IList<LinksInfo>)HttpRuntime.Cache[key];
                    if (data == null)//如果缓存没有读到数据
                    {
                        //访问DAL从数据库读取数据并加入缓存,最后返回
                        data = LinksDAL.SelectLinks();
                        AggregateCacheDependency acd = TableCacheDependency.GetDepandency("LinksTableDependency");
                        HttpRuntime.Cache.Add(key, data, acd,DateTime.Now.AddMinutes(CacheTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
                    }
                    return data;
                }
            }


    }

     


  • 相关阅读:
    Android 开发技术周报 Issue#288
    Android 开发技术周报 Issue#287
    Flutter Weekly Issue 62
    Android 开发技术周报 Issue#286
    Flutter Weekly Issue 61
    Flutter Weekly Issue 60
    最新解决navigator.webdriver=true的方法
    极验反爬虫防护分析之slide验证方式下图片的处理及滑动轨迹的生成思路
    极验反爬虫防护分析之接口交互的解密方法
    极验反爬虫防护分析之接口交互的解密方法补遗
  • 原文地址:https://www.cnblogs.com/tangself/p/2160453.html
Copyright © 2011-2022 走看看