ASP.NETCache的使用

页面缓存:

在前台添加   <%@ OutputCache Duration="5"  VaryByParam="none" %> 标签

上述代码使用@OutputCatch指令声明了页面缓存,该页面将被缓存120秒。@OutputCatch指令包括10个属性,通过这些属性能够分别为页面的不同情况进行缓存设置,常用的属性如下所示:

q CacheProfile:获取或设置OutputCacheProfile名称。

q Duration:获取或设置缓存项需要保留在缓存中的时间。

q VaryByHeader:获取或设置用于改变缓存项的一组都好分隔的HTTP标头名称。

q Location:获取或设置一个值,该值确定缓存项的位置,包括AnyClintDownstreamNoneServerServerAndClient。默认值为Any

q VaryByControl:获取或设置一簇分好分隔的控件标识符,这些标识符包含在当前页或用户控件内,用于改变当前的缓存项。

q NoStore:获取或设置一个值,该值确定是否设置了“Http Cache-Controlno-store”指令。

q VaryByCustom:获取输出缓存用来改变缓存项的自定义字符串列表。

q Enabled:获取或设置一个值,该值指示是否对当前内容启用了输出缓存。

q VaryByParam:获取查询字符串或窗体POST参数的列表。

通过设置相应的属性,可以为页面设置相应的缓存,当需要为Default.aspx设置缓存项时,可以使用VaryByParam属性进行设置,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="none" %>

上述代码使用了Duration属性和VarByParam属性设置了当前页的缓存属性。为一个页面进行整体的缓存设置往往是没有必要的,常常还会造成困扰,例如Default.aspx?id=1Default.aspx?id=100在缓存时可能呈现的页面是相同的,这往往不是开发人员所希望的。通过配置VarByParam属性能够指定缓存参数,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="id" %>

上述代码则通过参数id进行缓存,当id项不同时,ASP.NET所进行的页面缓存也不尽相同。这样保证了Default.aspx?id=1Default.aspx?id=100在缓存时所显示的页面并不一致。VarByHeaderVarByCustom主要用于根据访问页面的客户端对页面的外观或内容进行自定义。在ASP.NET中,一个页面可能需要为PC用户和MOBILE用户呈现输出,因此可以通过客户端的版本不同来缓存不同的数据,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="none" VaryByCustom="browser" %>

自定义缓存:

 

protected void Button1_Click(object sender, EventArgs e)
        {
            Cache.Remove("title");
            Cache.Insert("", "", null, DateTime.Now.AddHours(1), TimeSpan.Zero);
            if (Cache["title"] == null)
            {
                string title = "查询数据库的操作"; //查询数据库的操作结果
                if (title != null)
                {
                    Button1.Text = title;
                    Cache["title"] = title;
                }
            }
            else
            {
                Button1.Text = Cache["title"].ToString();      
            }
        }

 

文件依赖缓存:

protected void Button2_Click(object sender, EventArgs e)
        {
            //Cache.Insert();
            //如果缓存中没有数据
            if (Cache["fmsg"] == null)
            {
                string path = Server.MapPath("~/a.txt");
                string msg = System.IO.File.ReadAllText(path);
                //创建文件依赖对象
                System.Web.Caching.CacheDependency cDep = new System.Web.Caching.CacheDependency(path);
                Cache.Add("fmsg", msg, cDep, System.Web.Caching.Cache.NoAbsoluteExpiration,
                    System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, RemoveCallback);
                Response.Write("刚才因为文件被修改所以缓存清空了,又创建了一个缓存,下次访问的时候就能看到了");
            }
            //缓存中有数据
            else
            {
                Response.Write("Cache['fmsg']=" + Cache["fmsg"].ToString());
            }
        }
        //回调函数   当数据清空的时候
        void RemoveCallback(string key, object value, System.Web.Caching.CacheItemRemovedReason reason)
        {
            string logPath = Server.MapPath("~/cache.log");
            System.IO.File.AppendAllText(logPath,"CacheDependency中,cache["+key+"]="+value.ToString()+"因为"+reason.ToString()+
                "被移除了");
        }


Cache  insert方法

 

protected void Button3_Click(object sender, EventArgs e)
        {
          //  为数据库中的表新建对应的表,表的标示码,版本号。
          //  为原来的表创建触发器,当发生改变的时候使版本号变化
            //配置web.config文件 等
            string msg = "数据库取出来的数据";     //查询数据库的操作结果
            System.Web.Caching.SqlCacheDependency sqlDep = new
                System.Web.Caching.SqlCacheDependency("依赖数据库名","依赖表名");
            Cache.Insert("fmsg", msg, sqlDep, System.Web.Caching.Cache.NoAbsoluteExpiration,
                    System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, RemoveCallback);
        }

 

数据源缓存

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;

namespace 缓存相关
{
    public partial class 数据源缓存 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ObjectDataSource obj = new ObjectDataSource();
            obj.EnableCaching = true;
            obj.CacheDuration = 20;
            obj.CacheExpirationPolicy = DataSourceCacheExpiry.Sliding;  //访问后就清空重新开始计数
            obj.CacheExpirationPolicy = DataSourceCacheExpiry.Absolute;  //累计访问计数
      
        }

        private string name;

        public void GetInfo()
        {
            SqlConnection conn = new SqlConnection();
            conn.Open();
            SqlCommand cmd = new SqlCommand("@",conn);
            SqlParameter[] parms = { 
                                   new SqlParameter("@",""),
                                    new SqlParameter("@","")
                                   };
            cmd.Parameters.AddRange(parms);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                DataBin(); 
            }
        }

        public void DataBin()
        { 
            //绑定操作
        }
    }
}

 

数据缓存代码:

using System;
using System.Web;
using System.Web.Caching;
using System.Collections;
using System.Text.RegularExpressions;

namespace ICS.NewOperationClass
{
    /// <summary>
    /// 设置Cache操作类
    /// </summary>
    public class SetCache
    {
        #region 用户自定义变量
        private static readonly Cache _cache;//缓存实例
        private static readonly int hourfactor;
        #endregion

        #region 构造函数
        static SetCache()
        {
            hourfactor = 3600;
            _cache = HttpRuntime.Cache;
        }

        private SetCache()
        {
        }
        #endregion

        #region 清除所有缓存
        /// <summary>
        /// 清除所有缓存
        /// </summary>
        public static void Clear()
        {
            //要循环访问 Cache 对象的枚举数
            IDictionaryEnumerator enumerator = _cache.GetEnumerator();//检索用于循环访问包含在缓存中的键设置及其值的字典枚举数
            if (enumerator != null)
            {
                while (enumerator.MoveNext())
                {
                    _cache.Remove(enumerator.Key.ToString());
                }
            }
        }
        #endregion

        #region 得到缓存实例
        /// <summary>
        /// 得到缓存实例
        /// </summary>
        /// <param name="key">缓存实例名称</param>
        /// <returns>返回缓存实例</returns>
        public static object GetCache(string key)
        {
            return _cache[key];
        }
        #endregion

        #region 缓存实例插入
        /// <summary>
        /// 缓存实例插入(默认缓存20分钟)
        /// </summary>
        /// <param name="key">缓存实例名称</param>
        /// <param name="obj">要缓存的对象</param>
        public static void Insert(string key, object obj)
        {
            CacheDependency dep = null;
            Insert(key, obj, dep, 20);
        }

        /// <summary>
        /// 缓存实例插入
        /// </summary>
        /// <param name="key">缓存实例名称</param>
        /// <param name="obj">要缓存的对象</param>
        /// <param name="seconds">缓存的时间</param>
        public static void Insert(string key, object obj, int seconds)
        {
            CacheDependency dep = null;
            Insert(key, obj, dep, seconds);
        }

        /// <summary>
        /// 缓存实例插入(缓存过期时间是一天)
        /// </summary>
        /// <param name="key">缓存实例名称</param>
        /// <param name="obj">要缓存的对象</param>
        /// <param name="dep">缓存的依赖项</param>
        public static void Insert(string key, object obj, CacheDependency dep)
        {
            Insert(key, obj, dep, hourfactor * 12);
        }

        /// <summary>
        /// 缓存实例插入(缓存过期时间是一天)
        /// </summary>
        /// <param name="key">缓存实例名称</param>
        /// <param name="obj">要缓存的对象</param>
        /// <param name="xmlPath">缓存的依赖项xml文件的路径(绝对路径)</param>
        public static void Insert(string key, object obj, string xmlPath)
        {
            CacheDependency dep = new CacheDependency(xmlPath);
            Insert(key, obj, dep, hourfactor * 12);
        }

        /// <summary>
        /// 缓存实例插入
        /// </summary>
        /// <param name="key">缓存实例名称</param>
        /// <param name="obj">要缓存的对象<</param>
        /// <param name="seconds">缓存时间</param>
        /// <param name="priority">该对象相对于缓存中存储的其他项的成本</param>
        public static void Insert(string key, object obj, int seconds, CacheItemPriority priority)
        {
            Insert(key, obj, null, seconds, priority);
        }

        /// <summary>
        /// 缓存实例插入
        /// </summary>
        /// <param name="key">用于引用该对象的缓存键</param>
        /// <param name="obj">要插入缓存中的对象</param>
        /// <param name="dep">该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含空引用(Visual Basic 中为 Nothing)</param>
        /// <param name="seconds">所插入对象将过期并被从缓存中移除的时间。</param>
        public static void Insert(string key, object obj, CacheDependency dep, int seconds)
        {
            Insert(key, obj, dep, seconds, CacheItemPriority.Normal);
        }

        /// <summary>
        /// 缓存实例插入
        /// </summary>
        /// <param name="key">用于引用该对象的缓存键</param>
        /// <param name="obj">要插入缓存中的对象</param>
        /// <param name="xmlPath">缓存的依赖项xml文件的路径(绝对路径)</param>
        /// <param name="seconds">所插入对象将过期并被从缓存中移除的时间。</param>
        public static void Insert(string key, object obj, string xmlPath, int seconds)
        {
            CacheDependency dep = new CacheDependency(xmlPath);
            Insert(key, obj, dep, seconds, CacheItemPriority.Normal);
        }

        /// <summary>
        /// 缓存实例插入
        /// </summary>
        /// <param name="key">用于引用该对象的缓存键</param>
        /// <param name="obj">要插入缓存中的对象</param>
        /// <param name="dep">该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含空引用(Visual Basic 中为 Nothing)。</param>
        /// <param name="seconds">所插入对象将过期并被从缓存中移除的时间。</param>
        /// <param name="priority">该对象相对于缓存中存储的其他项的成本,由 CacheItemPriority 枚举表示。该值由缓存在退出对象时使用;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。 </param>
        public static void Insert(string key, object obj, CacheDependency dep, int seconds, CacheItemPriority priority)
        {
            if (obj != null)
            {
                _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double)seconds), TimeSpan.Zero, priority, null);
            }
        }
        #endregion

        #region 移出单个缓存
        /// <summary>
        /// 移出单个缓存
        /// </summary>
        /// <param name="key">缓存实例名称</param>
        public static void Remove(string key)
        {
            _cache.Remove(key);
        }

        #region 得到所有使用的Cache键值
        /// <summary>
        /// 得到所有使用的Cache键值
        /// </summary>
        /// <returns>返回所有的Cache键值</returns>
        public static ArrayList GetAllCacheKey()
        {
            ArrayList arrList = new ArrayList();
            IDictionaryEnumerator enumerator = _cache.GetEnumerator();
            if (enumerator != null)
            {
                while (enumerator.MoveNext())
                {
                    arrList.Add(enumerator.Key);
                }
            }
            return arrList;
        }
        #endregion
    }
}

  

posted @ 2013-06-04 09:27  张国朋  阅读(237)  评论(0编辑  收藏  举报