且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

.NET 缓存的设计

更新时间:2022-09-24 10:08:13

关于缓存的设计
1、什么情况下用缓存

缓存是提高应用程序性能的***方法之一。运用缓存可以优化数据查询,避免不必要的网络数据回传,和避免执行不必要的完全相同的数据处理逻辑。在实现缓存的时候我们要确定什么时候装入缓存数据。用异步装入缓存或用批处理方式来避免出现客户端数据延迟。
一般来说在一定时间内请求了相同的业务逻辑而没有变更的话,可以采用缓存来设计。数据请求频繁的的请求不适合采用缓存,如论坛的回复,但是论坛的主题是可以采用缓存设计的。
2、缓存设计的步骤
确定缓存数据结构:即设计中哪些数据用到了缓存,设计这些数据的缓存结构
确定缓存什么数据
确定缓存过期规则和清理
确定如何装入缓存数据
3、示例 Community Server的缓存类

 

.NET 缓存的设计
  1.NET 缓存的设计using System;
  2.NET 缓存的设计using System.Collections;
  3.NET 缓存的设计using System.Text.RegularExpressions;
  4.NET 缓存的设计using System.Web;
  5.NET 缓存的设计using System.Web.Caching;
  6.NET 缓存的设计
  7.NET 缓存的设计namespace Larry.Cache
  8.NET 缓存的设计{
  9.NET 缓存的设计    /// <summary>
 10.NET 缓存的设计    /// 缓存类 Community Server的缓存类
 11.NET 缓存的设计    /// </summary>

 12.NET 缓存的设计    public class BaseCache
 13.NET 缓存的设计    {
 14.NET 缓存的设计        /// <summary>
 15.NET 缓存的设计        /// CacheDependency 说明
 16.NET 缓存的设计        /// 如果您向 Cache 中添加某个具有依赖项的项,当依赖项更改时,
 17.NET 缓存的设计        /// 该项将自动从 Cache 中删除。例如,假设您向 Cache 中添加某项,
 18.NET 缓存的设计        /// 并使其依赖于文件名数组。当该数组中的某个文件更改时,
 19.NET 缓存的设计        /// 与该数组关联的项将从缓存中删除。
 20.NET 缓存的设计        /// [C#] 
 21.NET 缓存的设计        /// Insert the cache item.
 22.NET 缓存的设计        /// CacheDependency dep = new CacheDependency(fileName, dt);
 23.NET 缓存的设计        /// cache.Insert("key", "value", dep);
 24.NET 缓存的设计        /// </summary>

 25.NET 缓存的设计        public static readonly int DayFactor = 17280;
 26.NET 缓存的设计        public static readonly int HourFactor = 720;
 27.NET 缓存的设计        public static readonly int MinuteFactor = 12;
 28.NET 缓存的设计        public static readonly double SecondFactor = 0.2;
 29.NET 缓存的设计
 30.NET 缓存的设计        private static readonly System.Web.Caching.Cache _cache;
 31.NET 缓存的设计
 32.NET 缓存的设计        private static int Factor = 1440;
 33.NET 缓存的设计
 34.NET 缓存的设计        /// <summary>
 35.NET 缓存的设计        /// 单件模式
 36.NET 缓存的设计        /// </summary>

 37.NET 缓存的设计        static BaseCache()
 38.NET 缓存的设计        {
 39.NET 缓存的设计            HttpContext context = HttpContext.Current;
 40.NET 缓存的设计            if (context != null)
 41.NET 缓存的设计            {
 42.NET 缓存的设计                _cache = context.Cache;
 43.NET 缓存的设计            }

 44.NET 缓存的设计            else
 45.NET 缓存的设计            {
 46.NET 缓存的设计                _cache = HttpRuntime.Cache;
 47.NET 缓存的设计            }

 48.NET 缓存的设计        }

 49.NET 缓存的设计
 50.NET 缓存的设计        /// <summary>
 51.NET 缓存的设计        /// 一次性清除所有缓存
 52.NET 缓存的设计        /// </summary>

 53.NET 缓存的设计        public static void Clear()
 54.NET 缓存的设计        {
 55.NET 缓存的设计            IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
 56.NET 缓存的设计            ArrayList al = new ArrayList();
 57.NET 缓存的设计            while (CacheEnum.MoveNext()) //逐个清除
 58.NET 缓存的设计            {
 59.NET 缓存的设计                al.Add(CacheEnum.Key);
 60.NET 缓存的设计            }

 61.NET 缓存的设计
 62.NET 缓存的设计            foreach (string key in al)
 63.NET 缓存的设计            {
 64.NET 缓存的设计                _cache.Remove(key);
 65.NET 缓存的设计            }

 66.NET 缓存的设计
 67.NET 缓存的设计        }

 68.NET 缓存的设计
 69.NET 缓存的设计
 70.NET 缓存的设计
 71.NET 缓存的设计        public static void RemoveByPattern(string pattern)
 72.NET 缓存的设计        {
 73.NET 缓存的设计            IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
 74.NET 缓存的设计            Regex regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
 75.NET 缓存的设计            while (CacheEnum.MoveNext())
 76.NET 缓存的设计            {
 77.NET 缓存的设计                if (regex.IsMatch(CacheEnum.Key.ToString()))
 78.NET 缓存的设计                    _cache.Remove(CacheEnum.Key.ToString());
 79.NET 缓存的设计            }

 80.NET 缓存的设计        }

 81.NET 缓存的设计
 82.NET 缓存的设计        /// <summary>
 83.NET 缓存的设计        /// 清除特定的缓存
 84.NET 缓存的设计        /// </summary>
 85.NET 缓存的设计        /// <param name="key"></param>

 86.NET 缓存的设计        public static void Remove(string key)
 87.NET 缓存的设计        {
 88.NET 缓存的设计            _cache.Remove(key);
 89.NET 缓存的设计        }

 90.NET 缓存的设计
 91.NET 缓存的设计        /// <summary>
 92.NET 缓存的设计        /// 缓存OBJECT. 
 93.NET 缓存的设计        /// </summary>
 94.NET 缓存的设计        /// <param name="key"></param>
 95.NET 缓存的设计        /// <param name="obj"></param>

 96.NET 缓存的设计        public static void Insert(string key, object obj)
 97.NET 缓存的设计        {
 98.NET 缓存的设计            Insert(key, obj, null1);
 99.NET 缓存的设计        }

100.NET 缓存的设计
101.NET 缓存的设计        /// <summary>
102.NET 缓存的设计        /// 缓存obj 并建立依赖项
103.NET 缓存的设计        /// </summary>
104.NET 缓存的设计        /// <param name="key"></param>
105.NET 缓存的设计        /// <param name="obj"></param>
106.NET 缓存的设计        /// <param name="dep"></param>

107.NET 缓存的设计        public static void Insert(string key, object obj, CacheDependency dep)
108.NET 缓存的设计        {
109.NET 缓存的设计            Insert(key, obj, dep, MinuteFactor * 3);
110.NET 缓存的设计        }

111.NET 缓存的设计
112.NET 缓存的设计        /// <summary>
113.NET 缓存的设计        /// 按秒缓存对象
114.NET 缓存的设计        /// </summary>
115.NET 缓存的设计        /// <param name="key"></param>
116.NET 缓存的设计        /// <param name="obj"></param>
117.NET 缓存的设计        /// <param name="seconds"></param>

118.NET 缓存的设计        public static void Insert(string key, object obj, int seconds)
119.NET 缓存的设计        {
120.NET 缓存的设计            Insert(key, obj, null, seconds);
121.NET 缓存的设计        }

122.NET 缓存的设计
123.NET 缓存的设计        /// <summary>
124.NET 缓存的设计        /// 按秒缓存对象 并存储优先级
125.NET 缓存的设计        /// </summary>
126.NET 缓存的设计        /// <param name="key"></param>
127.NET 缓存的设计        /// <param name="obj"></param>
128.NET 缓存的设计        /// <param name="seconds"></param>
129.NET 缓存的设计        /// <param name="priority"></param>

130.NET 缓存的设计        public static void Insert(string key, object obj, int seconds, CacheItemPriority priority)
131.NET 缓存的设计        {
132.NET 缓存的设计            Insert(key, obj, null, seconds, priority);
133.NET 缓存的设计        }

134.NET 缓存的设计
135.NET 缓存的设计        /// <summary>
136.NET 缓存的设计        /// 按秒缓存对象 并建立依赖项
137.NET 缓存的设计        /// </summary>
138.NET 缓存的设计        /// <param name="key"></param>
139.NET 缓存的设计        /// <param name="obj"></param>
140.NET 缓存的设计        /// <param name="dep"></param>
141.NET 缓存的设计        /// <param name="seconds"></param>

142.NET 缓存的设计        public static void Insert(string key, object obj, CacheDependency dep, int seconds)
143.NET 缓存的设计        {
144.NET 缓存的设计            Insert(key, obj, dep, seconds, CacheItemPriority.Normal);
145.NET 缓存的设计        }

146.NET 缓存的设计
147.NET 缓存的设计        /// <summary>
148.NET 缓存的设计        /// 按秒缓存对象 并建立具有优先级的依赖项
149.NET 缓存的设计        /// </summary>
150.NET 缓存的设计        /// <param name="key"></param>
151.NET 缓存的设计        /// <param name="obj"></param>
152.NET 缓存的设计        /// <param name="dep"></param>
153.NET 缓存的设计        /// <param name="seconds"></param>
154.NET 缓存的设计        /// <param name="priority"></param>

155.NET 缓存的设计        public static void Insert(string key, object obj, CacheDependency dep, int seconds, CacheItemPriority priority)
156.NET 缓存的设计        {
157.NET 缓存的设计            if (obj != null)
158.NET 缓存的设计            {
159.NET 缓存的设计                _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds(Factor * seconds), TimeSpan.Zero, priority, null);
160.NET 缓存的设计            }

161.NET 缓存的设计
162.NET 缓存的设计        }

163.NET 缓存的设计
164.NET 缓存的设计
165.NET 缓存的设计        public static void MicroInsert(string key, object obj, int secondFactor)
166.NET 缓存的设计        {
167.NET 缓存的设计            if (obj != null)
168.NET 缓存的设计            {
169.NET 缓存的设计                _cache.Insert(key, obj, null, DateTime.Now.AddSeconds(Factor * secondFactor), TimeSpan.Zero);
170.NET 缓存的设计            }

171.NET 缓存的设计        }

172.NET 缓存的设计
173.NET 缓存的设计        /// <summary>
174.NET 缓存的设计        /// 最大时间缓存
175.NET 缓存的设计        /// </summary>
176.NET 缓存的设计        /// <param name="key"></param>
177.NET 缓存的设计        /// <param name="obj"></param>

178.NET 缓存的设计        public static void Max(string key, object obj)
179.NET 缓存的设计        {
180.NET 缓存的设计            Max(key, obj, null);
181.NET 缓存的设计        }

182.NET 缓存的设计
183.NET 缓存的设计        /// <summary>
184.NET 缓存的设计        /// 具有依赖项的最大时间缓存
185.NET 缓存的设计        /// </summary>
186.NET 缓存的设计        /// <param name="key"></param>
187.NET 缓存的设计        /// <param name="obj"></param>
188.NET 缓存的设计        /// <param name="dep"></param>

189.NET 缓存的设计        public static void Max(string key, object obj, CacheDependency dep)
190.NET 缓存的设计        {
191.NET 缓存的设计            if (obj != null)
192.NET 缓存的设计            {
193.NET 缓存的设计                _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null);
194.NET 缓存的设计            }

195.NET 缓存的设计        }

196.NET 缓存的设计
197.NET 缓存的设计        /// <summary>
198.NET 缓存的设计        /// Insert an item into the cache for the Maximum allowed time
199.NET 缓存的设计        /// </summary>
200.NET 缓存的设计        /// <param name="key"></param>
201.NET 缓存的设计        /// <param name="obj"></param>

202.NET 缓存的设计        public static void Permanent(string key, object obj)
203.NET 缓存的设计        {
204.NET 缓存的设计            Permanent(key, obj, null);
205.NET 缓存的设计        }

206.NET 缓存的设计
207.NET 缓存的设计        public static void Permanent(string key, object obj, CacheDependency dep)
208.NET 缓存的设计        {
209.NET 缓存的设计            if (obj != null)
210.NET 缓存的设计            {
211.NET 缓存的设计                _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.NotRemovable, null);
212.NET 缓存的设计            }

213.NET 缓存的设计        }

214.NET 缓存的设计
215.NET 缓存的设计        public static object Get(string key)
216.NET 缓存的设计        {
217.NET 缓存的设计            return _cache[key];
218.NET 缓存的设计        }

219.NET 缓存的设计
220.NET 缓存的设计        /// <summary>
221.NET 缓存的设计        /// Return int of seconds * SecondFactor
222.NET 缓存的设计        /// </summary>

223.NET 缓存的设计        public static int SecondFactorCalculate(int seconds)
224.NET 缓存的设计        {
225.NET 缓存的设计            // Insert method below takes integer seconds, so we have to round any fractional values
226.NET 缓存的设计            return Convert.ToInt32(Math.Round((double)seconds * SecondFactor));
227.NET 缓存的设计        }

228.NET 缓存的设计    }

229.NET 缓存的设计}

230.NET 缓存的设计

 

其实这个类就是一个单件模式的设计 和缓存的公共操作方法,其中CacheDependency表示建立缓存依赖项,CacheItemPriority表示缓存的优先级。S使用如下

 

 1.NET 缓存的设计public static CardShop.Model.Systems GetConfig() 
 2.NET 缓存的设计    {
 3.NET 缓存的设计        const string cacheKey = "WebConfig";
 4.NET 缓存的设计        CardShop.Model.Systems sampleCacheTable = Larry.Cache.BaseCache.Get(cacheKey) as CardShop.Model.Systems;
 5.NET 缓存的设计        if (sampleCacheTable == null)
 6.NET 缓存的设计        {
 7.NET 缓存的设计                                  OprationCheck.Message("第一次加载使用缓存");
 8.NET 缓存的设计            sampleCacheTable = model;
 9.NET 缓存的设计            Larry.Cache.BaseCache.Insert(cacheKey, sampleCacheTable, 24 * Larry.Cache.BaseCache.MinuteFactor);
10.NET 缓存的设计        }

11.NET 缓存的设计        else
12.NET 缓存的设计        {
13.NET 缓存的设计            OprationCheck.Message("已经加载了缓存不需要再加载");
14.NET 缓存的设计        }

15.NET 缓存的设计        return sampleCacheTable;
16.NET 缓存的设计    }

 

分类: ASP.NET
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2013/03/12/2955330.html,如需转载请自行联系原作者