• 基于ObjectCache的应用


    /// <summary>
        /// 缓存管理器接口类
        /// </summary>
        public interface ICacheManager
        {
            /// <summary>
            /// 以对象的形式获取缓存中的指定缓存项。
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="key"> 要获取的缓存项的唯一标识符。</param>
            /// <returns> 由 key 标识的缓存项.</returns>
            T Get<T>(string key);

            /// <summary>
            /// 向缓存中插入缓存项,同时指定基于时间的过期详细信息。
            /// </summary>
            /// <param name="key">该缓存项的唯一标识符。</param>
            /// <param name="data">要插入的对象。</param>
            /// <param name="cacheTime">缓存项的固定的过期日期和时间。</param>
            void Set(string key, object data, int cacheTime);

            /// <summary>
            ///   检查缓存中是否已存在该缓存项。
            /// </summary>
            /// <param name="key">该缓存项的唯一标识符。</param>
            /// <returns> 如果缓存中包含具有与 key 相同的键值的缓存项,则为 true;否则为 false。</returns>
            bool IsSet(string key);


            /// <summary>
            /// 从缓存中移除缓存项。
            /// </summary>
            /// <param name="key">/该缓存项的唯一标识符。</param>
            void Remove(string key);

            /// <summary>
            /// 通过正则表达式清除缓存
            /// </summary>
            /// <param name="pattern">pattern</param>
            void RemoveByPattern(string pattern);

            /// <summary>
            /// 清除缓存
            /// </summary>
            void Clear();
        }

    /// <summary>
        /// 全局数据缓存MemoryCacheManager类,使用.net  缓存框架实现数据缓存
        /// </summary>
        public partial class MemoryCacheManager : ICacheManager
        {
            /// <summary>
            ///   表示一个对象缓存并提供用于访问该对象缓存的基方法和属性。
            /// </summary>
            protected ObjectCache Cache
            {
                get
                {
                    return MemoryCache.Default;
                }
            }
           
            /// <summary>
            /// 在派生类中重写时,以对象的形式获取缓存中的指定缓存项。
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="key"> 要获取的缓存项的唯一标识符。</param>
            /// <returns> 由 key 标识的缓存项.</returns>
            public T Get<T>(string key)
            {
                return (T)Cache[key];
            }

            /// <summary>
            /// 在派生类中重写时,向缓存中插入缓存项,同时指定基于时间的过期详细信息。
            /// </summary>
            /// <param name="key">该缓存项的唯一标识符。</param>
            /// <param name="data">要插入的对象。</param>
            /// <param name="cacheTime">缓存项的固定的过期日期和时间。</param>
            public void Set(string key, object data, int cacheTime)
            {
                if (data == null)
                    return;

                //  定义一个包含该缓存项的逐出详细信息的对象。此对象提供比简单绝对过期更多的逐出选项。
                var policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
                Cache.Add(new CacheItem(key, data), policy);
            }

            /// <summary>
            ///   在派生类中重写时,检查缓存中是否已存在该缓存项。
            /// </summary>
            /// <param name="key">该缓存项的唯一标识符。</param>
            /// <returns> 如果缓存中包含具有与 key 相同的键值的缓存项,则为 true;否则为 false。</returns>
            public bool IsSet(string key)
            {
                return (Cache.Contains(key));
            }

            /// <summary>
            ///  在派生类中重写时,从缓存中移除缓存项。
            /// </summary>
            /// <param name="key">/该缓存项的唯一标识符。</param>
            public void Remove(string key)
            {
                Cache.Remove(key);
            }

            /// <summary>
            /// 通过正则匹配从缓存中移除缓存项。
            /// </summary>
            /// <param name="pattern">正则表达式</param>
            public void RemoveByPattern(string pattern)
            {
                var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
                var keysToRemove = new List<String>();

                foreach (var item in Cache)
                    if (regex.IsMatch(item.Key))
                        keysToRemove.Add(item.Key);

                foreach (string key in keysToRemove)
                {
                    Remove(key);
                }
            }

            /// <summary>
            ///清除缓存
            /// </summary>
            public void Clear()
            {
                foreach (var item in Cache)
                    Remove(item.Key);
            }
        }

    /// <summary>
        ///缓存扩展类
        /// </summary>
        public static class CacheExtensions
        {
            /// <summary>
            /// 向缓存中插入缓存项或获取缓存中的指定缓存项
            /// </summary>
            /// <typeparam name="T">类型</typeparam>
            /// <param name="cacheManager">使用的缓存管理器</param>
            /// <param name="key">该缓存项的唯一标识符</param>
            /// <param name="acquire">委托类型</param>
            /// <returns></returns>
            public static T Get<T>(this ICacheManager cacheManager, string key, Func<T> acquire)
            {
                return Get(cacheManager, key, 60, acquire);
            }
            /// <summary>
            /// 向缓存中插入缓存项或获取缓存中的指定缓存项
            /// </summary>
            /// <typeparam name="T">类型</typeparam>
            /// <param name="cacheManager">使用的缓存管理器</param>
            /// <param name="key">该缓存项的唯一标识符</param>
            /// <param name="cacheTime">缓存项的固定的过期日期和时间</param>
            /// <param name="acquire">委托类型</param>
            /// <returns></returns>
            public static T Get<T>(this ICacheManager cacheManager, string key, int cacheTime, Func<T> acquire)
            {
                if (cacheManager.IsSet(key))
                {
                    // 以对象的形式获取缓存中的指定缓存项。
                    return cacheManager.Get<T>(key);
                }
                else
                {
                    var result = acquire();
                         //向缓存中插入缓存项,同时指定基于时间的过期详细信息。
                        cacheManager.Set(key, result, cacheTime);
                    return result;
                }
            }
        }

  • 相关阅读:
    PL/SQL Developer 和 instantclient客户端安装配置(图文)
    VirtualBox + Centos 使用NAT + Host-Only 方式联网
    zookeeper的安装
    Socket编程基础篇
    WebSocket教程(二)
    WebSocket教程(一)
    Js判断浏览器类型
    JVM内存模型
    js 正则去除指定的单词
    Java线上应用故障排查之一:高CPU占用
  • 原文地址:https://www.cnblogs.com/fjzhang/p/2755302.html
Copyright © 2020-2023  润新知