System.Web.Cache缓存的封装和调用示例

目录

  • HttpCache类
  • Objects类
  • 调用示例

HttpCache类

   /// <summary>
    /// System.Web.Cache缓存的封装
    /// </summary>
    public static class HttpCache
    {
        /// <summary>
        /// 当前应用程序的的缓存实例
        /// </summary>
        public static System.Web.Caching.Cache Current
        {
            get
            {
                return HttpRuntime.Cache;
            }
        }

        /// <summary>
        /// 已缓存的缓存项数量
        /// </summary>
        public static int Count
        {
            get
            {
                return Current.Count;
            }
        }

        /// <summary>
        /// 获取某个缓存项
        /// </summary>
        /// <param name="key">键值</param>
        /// <returns></returns>
        public static object Get(string key)
        {
            return Current.Get(key);
        }

        /// <summary>
        /// 移除某个缓存项
        /// </summary>
        /// <param name="key">键值</param>
        /// <returns></returns>
        public static object Remove(string key)
        {
            return Current.Remove(key);
        }
        /// <summary>
        /// 清除所有缓存
        /// </summary>
        public static void Clear()
        {
            var c = Current;
            foreach (DictionaryEntry v in c)
            {
                c.Remove((string)v.Key);
            }
        }
        /// <summary>
        /// 添加缓存项
        /// </summary>
        /// <param name="key">键值</param>
        /// <param name="data">缓存数据</param>
        public static void Add(string key, object data)
        {
            Current.Insert(key, data);
        }
        /// <summary>
        /// 添加具有一个过期时间的缓存项
        /// </summary>
        /// <param name="key">键值</param>
        /// <param name="data">缓存数据</param>
        /// <param name="absoluteExpiration">绝对的过期时间,到此时间后缓存过期</param>
        public static void Add(string key, object data, DateTime absoluteExpiration)
        {
            Current.Insert(key, data, null, absoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);
        }
        /// <summary>
        /// 添加具有某些依赖项的缓存项
        /// </summary>
        /// <param name="key">键值</param>
        /// <param name="data">缓存数据</param>
        /// <param name="dependencies">依赖项</param>
        public static void Add(string key, object data, System.Web.Caching.CacheDependency dependencies)
        {
            Current.Insert(key, data, dependencies);
        }
        /// <summary>
        /// 添加与某些文件关连的缓存项,当这些文件被修改时缓存过期
        /// </summary>
        /// <param name="key">键值</param>
        /// <param name="data">缓存数据</param>
        /// <param name="files">缓存依赖的文件地址,当这些文件有变更时缓存项将自动失效</param>
        public static void Add(string key, object data, params string[] files)
        {
            Current.Insert(key, data, new System.Web.Caching.CacheDependency(files));
        }
        /// <summary>
        /// 添加具有一个过期时间并且与某些文件关连的缓存项,当过期时间已到或这些文件被修改时缓存过期
        /// </summary>
        /// <param name="key">键值</param>
        /// <param name="data">缓存数据</param>
        /// <param name="absoluteExpiration">绝对的过期时间,到此时间后缓存项自动过期</param>
        /// <param name="files">缓存依赖的文件地址,当这些文件有变更时缓存项将自动失效</param>
        public static void Add(string key, object data, DateTime absoluteExpiration, params string[] files)
        {
            Current.Insert(key, data, new System.Web.Caching.CacheDependency(files), absoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);
        }
        #region GetOrAdd
        /// <summary>
        /// 返回某个缓存项,如果不存在则调用函数委托获取值,并将值存入缓存后返回
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">缓存项键值</param>
        /// <param name="handler">缓存项不存在时重新获取数据的函数委托</param>
        /// <returns></returns>
        public static T GetOrAdd<T>(string key, Func<T> handler)
        {
            return (T)(Get(key).IfNull(() =>
            {
                T v = handler.Invoke();
                if (v != null)
                {
                    //存入缓存
                    Add(key, v);
                }
                return v;
            }));
        }
        /// <summary>
        /// 返回某个缓存项,如果不存在则调用函数委托获取值,并将值存入缓存后返回
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">缓存项键值</param>
        /// <param name="absoluteExpiration">绝对的过期时间,当时间超过此值时缓存项将自动失效</param>
        /// <param name="handler">缓存项不存在时重新获取数据的函数委托</param>
        /// <returns></returns>
        public static T GetOrAdd<T>(string key, Func<T> handler, DateTime absoluteExpiration)
        {
            return (T)(Get(key).IfNull(() =>
            {
                T v = handler.Invoke();
                if (v != null)
                {
                    //存入缓存
                    Add(key, v, absoluteExpiration);
                }
                return v;
            }));
        }
        /// <summary>
        /// 返回某个缓存项,如果不存在则调用函数委托获取值,并将值存入缓存后返回
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">缓存项键值</param>
        /// <param name="dependencies">缓存依赖</param>
        /// <param name="handler">缓存项不存在时重新获取数据的函数委托</param>
        /// <returns></returns>
        public static T GetOrAdd<T>(string key, Func<T> handler, System.Web.Caching.CacheDependency dependencies)
        {
            return (T)(Get(key).IfNull(() =>
            {
                T v = handler.Invoke();
                if (v != null)
                {
                    //存入缓存
                    Add(key, v, dependencies);
                }
                return v;
            }));
        }
        /// <summary>
        /// 返回某个缓存项,如果不存在则调用函数委托获取值,并将值存入缓存后返回
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">缓存项键值</param>
        /// <param name="files">缓存依赖的文件地址,当这些文件有变更时缓存项将自动失效</param>
        /// <param name="handler">缓存项不存在时重新获取数据的函数委托</param>
        /// <returns></returns>
        public static T GetOrAdd<T>(string key, Func<T> handler, params string[] files)
        {
            return (T)(Get(key).IfNull(() =>
            {
                T v = handler.Invoke();
                if (v != null)
                {
                    //存入缓存
                    Add(key, v, files);
                }
                return v;
            }));
        }
        /// <summary>
        /// 返回某个缓存项,如果不存在则调用函数委托获取值,并将值存入缓存后返回
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">缓存项键值</param>
        /// <param name="absoluteExpiration">绝对的过期时间,当时间超过此值时缓存项将自动失效</param>
        /// <param name="files">缓存依赖的文件地址,当这些文件有变更时缓存项将自动失效</param>
        /// <param name="handler">缓存项不存在时重新获取数据的函数委托</param>
        /// <returns></returns>
        public static T GetOrAdd<T>(string key, Func<T> handler, DateTime absoluteExpiration, params string[] files)
        {
            return (T)(Get(key).IfNull(() =>
            {
                T v = handler.Invoke();
                if (v != null)
                {
                    //存入缓存
                    Add(key, v, absoluteExpiration, files);
                }
                return v;
            }));
        }
        #endregion
    }

Objects类

    /// <summary>
    /// 与Object相关的扩展函数
    /// </summary>
    public static class Objects
    {
        #region 数据转换函数块
        /// <summary>
        /// 将某个对象转换为某种类型对象数据。
        /// 如果类型转换失败则返回对应目标类型的默认值,如果目标类型是枚举值,则返回第一个枚举值
        /// </summary>
        /// <typeparam name="T">需要转换的目标类型</typeparam>
        /// <param name="obj">需要转换的对象</param>
        /// <returns>转换后的类型数据</returns>
        /// <example>
        /// <code>
        /// int i = "1".As&lt;int&gt;();
        /// float f = "0.32".As&lt;float&gt;();
        /// DayOfWeek dayOfWeek = "Sunday".As&lt;DayOfWeek&gt;();
        /// DateTime time = "2011-01-01 23:00".As&lt;DateTime&gt;();
        /// </code>
        /// </example>
        public static T As<T>(this object obj)
        {
            Type t = typeof(T);
            T replacement = default(T);
            if (t.IsEnum)
            {
                //枚举类型。则获取第一个默认项
                replacement = (T)Enum.GetValues(t).GetValue(0);
            }
            //else if (t == typeof(string))
            //{
            //    //字符串,则以空字符串为默认值
            //    //replacement = (T)(object)string.Empty;
            //}
            return As<T>(obj, replacement);
        }
        /// <summary>
        /// 将某个对象转换为某种类型对象数据。 如果类型转换失败则返回替换值
        /// </summary>
        /// <typeparam name="T">需要转换的目标类型</typeparam>
        /// <param name="obj">对象</param>
        /// <param name="replacement">如果转换失败则返回此替换值</param>
        /// <returns>转换后的类型数据, 如果类型转换失败则返回<paramref name="replacement"/>表示的替换值</returns>
        /// <example>
        /// <code>
        /// object v = null;
        /// int i = v.As&lt;int&gt;(0);                     //i = 0;
        /// float f = "0.32".As&lt;float&gt;(0);            //f = 0.32;
        /// string s = v.As&lt;string&gt;("null");          //s = "null";
        /// DateTime time = v.As&lt;DateTime&gt;(DateTime.Now); //time = DateTime.Now;
        /// </code>
        /// </example>
        public static T As<T>(this object obj, T replacement)
        {
            return (T)obj.As(typeof(T), replacement);
        }

        /// <summary>
        /// 转换为某种类型
        /// </summary>
        /// <param name="obj">对象</param>
        /// <param name="targetType">目标类型</param>
        /// <param name="replacement">如果转换失败则返回此替换值</param>
        /// <returns></returns>
        public static object As(this object obj, Type targetType, object replacement)
        {
            if (obj == null) return replacement;

            TypeCode targetTC = Type.GetTypeCode(targetType);
            Type sourceType = obj.GetType();

            if (!targetType.IsInstanceOfType(obj))
            {
                if (sourceType.IsEnum)
                {
                    //枚举类型,则特殊对待
                    try
                    {
                        return Convert.ChangeType(obj, targetType);
                    }
                    catch
                    {
                        return replacement;
                    }
                }
                else
                {
                    switch (targetTC)
                    {
                        case TypeCode.Empty:
                            return null;
                        case TypeCode.Object:
                            return replacement;
                        case TypeCode.DBNull:
                            return DBNull.Value;
                        case TypeCode.String:
                            return obj.ToString();
                        default:
                            bool error;
                            var v = obj.ToString().ConvertTo(targetType, out error);
                            return error ? replacement : v;
                    }
                }
            }
            else
            {
                return obj;
            }
        }

        /// <summary>
        /// 将某个对象转换为字符串对象
        /// </summary>
        /// <param name="obj">对象</param>
        /// <param name="empty">如果对象为null则返回此字符</param>
        /// <returns>对象的字符串表示方式。如果对象为null则返回<paramref name="empty"/>表示的字符串</returns>
        public static string ToString(this object obj, string empty)
        {
            if (obj == null) return empty;
            return obj.ToString();
        }
        /// <summary>
        /// 将某个对象转换为Json字符数据
        /// </summary>
        /// <param name="obj"></param>
        /// <returns>对象的Json格式的字符串。
        /// 对于DateTime类型的数据则返回“\/Date(时间戳)\/”的字符串数据;
        /// 而对于字符串,则对于非英文字母、数字的字符则返回utf码表示的字符。如对于中文的“我”则返回“\u6211”</returns>
        public static string ToJson(this object obj)
        {
            if (obj == null) return "null";
            TypeCode code = Convert.GetTypeCode(obj);
            switch (code)
            {
                case TypeCode.Boolean:
                    return ((bool)obj) ? "true" : "false";
                case TypeCode.DateTime:
                    DateTime d = (DateTime)obj;
                    return string.Format("\"\\/Date({0})\\/\"", d.ToTimestamp());
                case TypeCode.Empty:
                case TypeCode.DBNull:
                    return "null";
                case TypeCode.String:
                case TypeCode.Char:
                    return string.Format("\"{0}\"", obj.ToString().ToJavaScriptString());
                case TypeCode.Object:
                    return ObjectToJson(obj);
                default:
                    return obj.ToString();
            }
        }

        /// <summary>
        /// 将某个对象转换为Json数据
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private static string ObjectToJson(object obj)
        {
            //处理数组的情况
            if (obj is IEnumerable) return ListObjectToJson((IEnumerable)obj);

            StringBuilder buffer = new StringBuilder(64);
            buffer.Append("{");

            //取得公共属性
            PropertyDescriptorCollection pros = TypeDescriptor.GetProperties(obj);
            foreach (PropertyDescriptor p in pros)
            {
                if (buffer.Length != 1) buffer.Append(",");
                buffer.AppendFormat("\"{0}\":{1}", p.Name.ToJavaScriptString(), p.GetValue(obj).ToJson());
            }

            //取得公共字段
            Type type = obj.GetType();
            foreach (FieldInfo f in type.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                if (buffer.Length != 1) buffer.Append(",");
                buffer.AppendFormat("\"{0}\":{1}", f.Name.ToJavaScriptString(), f.GetValue(obj).ToJson());
            }

            buffer.Append("}");

            return buffer.ToString();
        }
        /// <summary>
        /// 将集合、列表对象转换为Json数据
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        private static string ListObjectToJson(IEnumerable list)
        {
            StringBuilder buffer = new StringBuilder(64);
            buffer.Append("[");
            foreach (object v in list)
            {
                if (buffer.Length != 1) buffer.Append(",");
                buffer.Append(v.ToJson());
            }
            buffer.Append("]");
            return buffer.ToString();
        }
        #endregion

        /// <summary>
        /// 如果对象为null则调用函数委托并返回函数委托的返回值。否则返回对象本身
        /// </summary>
        /// <param name="obj">对象</param>
        /// <param name="func">对象为null时用于调用的函数委托</param>
        /// <returns>如果对象不为null则返回对象本身,否则返回<paramref name="func"/>函数委托的返回值</returns>
        /// <example>
        /// <code>
        /// string v = null;
        /// string d = v.IfNull&lt;string&gt;(()=>"v is null");  //d = "v is null";
        /// string t = d.IfNull(() => "d is null");              //t = "v is null";
        /// </code>
        /// </example>
        public static T IfNull<T>(this T obj, Func<T> func)
            where T : class
        {
            if (obj == null)
            {
                return func == null ? default(T) : func();
            }
            else
            {
                return obj;
            }
        }
    }

调用示例

  • 文件依赖缓存调用示例
       private static void TestHttpCache()
        {

            string filePath = @"D:\report_data2.txt";
            while (true)
            {
                Thread.Sleep(1000);

                Func<string> func = () => { return testInsertCache(); };
                HttpCache.GetOrAdd<string>("testHttpCache", func, new CacheDependency(filePath));
                string cacheStr = (string)HttpCache.Get("testHttpCache");
                Console.WriteLine(cacheStr);
            }
        }

        private static string testInsertCache()
        {
            string line=string.Empty;
            try
            {
                string filePath = @"D:\report_data2.txt";
                // 创建一个 StreamReader 的实例来读取文件 ,using 语句也能关闭 StreamReader
                using (System.IO.StreamReader sr = new System.IO.StreamReader(filePath))
                {
                    line = sr.ReadToEnd();
                }
            }
            catch (Exception e)
            {
                // 向用户显示出错消息
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(e.Message);
            }
            return line;
        }

可以明显的看到,当修改"D:\report_data2.txt"文件内容并保存的时候,缓存内容会自己进行更新。

原文地址:https://www.cnblogs.com/zh672903/p/11101743.html

时间: 2024-10-01 17:41:39

System.Web.Cache缓存的封装和调用示例的相关文章

Cache缓存使用

之前做项目的时候需要用到缓存技术对客户端页面的一个List进行缓存设置,在这之前没使用过,因此对此做个记录: 1.缓存的引用空间:System.Web.Caching; 缓存命名空间主要提供三种操作:缓存数据对象.对象的缓存依赖和数据库的缓存依赖.其中缓存任何对象都使用一个类Cache,但当缓存发生改变时,普通对象和数据库对象的依赖处理不同. 2.管理缓存类:Cache Cache类用来存储数据对象,并提供方法对这些对象进行编辑.Cache类属于字典类,其根据一定的规则存储用户需要的数据,这些数

CDN之Web Cache

1. Cache 的工作方式 Web Cache 作为一种网页缓存技术,可以在用户访问网站服务器的任何一个中间网元上实现.根据 HTTP 协议的定义,在一次网页访问中,用户从客户端发出请求到网站服务器响应请求内容的交互过程中,通常会涉及 4 个关键的网元:用户.代理.网关和 Web 服务器.当 Web Cache 作为代理使用时,通常工作在正向代理或者透明代理的模式,Web Cache 可以在这两种模式下实现访问内容副本的缓存和服务:Web Cache 应用最多的地方还是在网关上,这也是 CDN

System.Web.Caching.Cache类 缓存 各种缓存依赖

System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用

System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖

Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用于缓存的字节数. Item 获取或设置指定键处的缓存项. 二.方法 方法

System.Web.Caching.Cache类 缓存 各种缓存依赖(转)

转自:http://www.cnblogs.com/kissdodog/archive/2013/05/07/3064895.html Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例.尽量使用前者. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物

深入System.Web.Caching命名空间 教你Hold住缓存管理(二)

本文分三篇,从缓存所在命名空间System.Web.Caching开始,详细的介绍.NET框架提供的缓存类和操作方法.看完之后你将学会: 第一篇-如何实现简单的数据缓存 第二篇-缓存从文件中读取的数据,并通过文件依赖实现缓存数据的及时更新 第三篇-缓存数据库中的整张表,并通过数据库依赖实现缓存数据的及时更新 在学习了第一篇Cache类的用法后,下面我们来继续看看如果缓存从文件中读取的的数据,并通过缓存依赖类CacheDependency实现缓存数据的及时更新. 一,缓存依赖类CacheDepen

深入System.Web.Caching命名空间 教你Hold住缓存管理(一)

本文分三篇,从缓存所在命名空间System.Web.Caching开始,详细的介绍.NET框架提供的缓存类和操作方法.看完之后你将学会: 第一篇-如何实现简单的数据缓存 第二篇-缓存从文件中读取的数据,并通过文件依赖实现缓存数据的及时更新 第三篇-缓存数据库中的整张表,并通过数据库依赖实现缓存数据的及时更新 一,System .Web.Caching与缓存工作机制简介 System.Web.Caching是用来管理缓存的命名空间,其父级空间是System.Web,由此可见,缓存通常用于Web网站

非静态的字段、方法或属性“System.Web.UI.Page.ClientScript...”要求对象引用 (封装注册脚本)

在写项目时想对asp.net的注册前台脚本事件进行封装,就添加了一个BasePage.cs页面,但一直报错‘非静态的字段.方法或属性“System.Web.UI.Page.ClientScript...”要求对象引用”’ 原写法: /// <summary> /// 显示客户端提示框 /// </summary> /// <param name="msg"></param> public static void ShowMsg(strin

调用WebServices报错,请求“System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的权限已失败。

解决方案: 需要降低信任级别到“Low”: <system.web><securityPolicy><trustLevel name="Full" policyFile="internal"/><trustLevel name="High" policyFile="web_hightrust.config"/><trustLevel name="Medium&qu