天天看點

.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,如需轉載請自行聯系原作者

繼續閱讀