天天看点

.NET 缓存的设计

关于缓存的设计

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 缓存的设计

 35

.NET 缓存的设计

        /// 单件模式

 36

.NET 缓存的设计

 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 缓存的设计

 51

.NET 缓存的设计

        /// 一次性清除所有缓存

 52

.NET 缓存的设计

 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 缓存的设计

 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 缓存的设计

 83

.NET 缓存的设计

        /// 清除特定的缓存

 84

.NET 缓存的设计

 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 缓存的设计

 92

.NET 缓存的设计

        /// 缓存OBJECT. 

 93

.NET 缓存的设计

 94

.NET 缓存的设计

 95

.NET 缓存的设计

        /// <param name="obj"></param>

 96

.NET 缓存的设计

        public static void Insert(string key, object obj)

 97

.NET 缓存的设计

 98

.NET 缓存的设计

            Insert(key, obj, null, 1);

 99

.NET 缓存的设计

100

.NET 缓存的设计

101

.NET 缓存的设计

102

.NET 缓存的设计

        /// 缓存obj 并建立依赖项

103

.NET 缓存的设计

104

.NET 缓存的设计

105

.NET 缓存的设计

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 缓存的设计

113

.NET 缓存的设计

        /// 按秒缓存对象

114

.NET 缓存的设计

115

.NET 缓存的设计

116

.NET 缓存的设计

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 缓存的设计

124

.NET 缓存的设计

        /// 按秒缓存对象 并存储优先级

125

.NET 缓存的设计

126

.NET 缓存的设计

127

.NET 缓存的设计

128

.NET 缓存的设计

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 缓存的设计

136

.NET 缓存的设计

        /// 按秒缓存对象 并建立依赖项

137

.NET 缓存的设计

138

.NET 缓存的设计

139

.NET 缓存的设计

140

.NET 缓存的设计

141

.NET 缓存的设计

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 缓存的设计

148

.NET 缓存的设计

        /// 按秒缓存对象 并建立具有优先级的依赖项

149

.NET 缓存的设计

150

.NET 缓存的设计

151

.NET 缓存的设计

152

.NET 缓存的设计

153

.NET 缓存的设计

154

.NET 缓存的设计

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 缓存的设计

168

.NET 缓存的设计

169

.NET 缓存的设计

                _cache.Insert(key, obj, null, DateTime.Now.AddSeconds(Factor * secondFactor), TimeSpan.Zero);

170

.NET 缓存的设计

171

.NET 缓存的设计

172

.NET 缓存的设计

173

.NET 缓存的设计

174

.NET 缓存的设计

        /// 最大时间缓存

175

.NET 缓存的设计

176

.NET 缓存的设计

177

.NET 缓存的设计

178

.NET 缓存的设计

        public static void Max(string key, object obj)

179

.NET 缓存的设计

180

.NET 缓存的设计

            Max(key, obj, null);

181

.NET 缓存的设计

182

.NET 缓存的设计

183

.NET 缓存的设计

184

.NET 缓存的设计

        /// 具有依赖项的最大时间缓存

185

.NET 缓存的设计

186

.NET 缓存的设计

187

.NET 缓存的设计

188

.NET 缓存的设计

189

.NET 缓存的设计

        public static void Max(string key, object obj, CacheDependency dep)

190

.NET 缓存的设计

191

.NET 缓存的设计

192

.NET 缓存的设计

193

.NET 缓存的设计

                _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null);

194

.NET 缓存的设计

195

.NET 缓存的设计

196

.NET 缓存的设计

197

.NET 缓存的设计

198

.NET 缓存的设计

        /// Insert an item into the cache for the Maximum allowed time

199

.NET 缓存的设计

200

.NET 缓存的设计

201

.NET 缓存的设计

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 缓存的设计

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 缓存的设计

221

.NET 缓存的设计

        /// Return int of seconds * SecondFactor

222

.NET 缓存的设计

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 缓存的设计

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

继续阅读