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

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

1

using System;  2

using System.Collections;  3

using System.Text.RegularExpressions;  4

using System.Web;  5

using System.Web.Caching;  6

7

namespace Larry.Cache  8

{  9

    

/// <summary> 10

    

/// 缓存类 Community Server的缓存类 11

    

/// </summary> 12

public class BaseCache 13

    

{ 14

        

/// <summary> 15

        

/// CacheDependency 说明 16

        

/// 如果您向 Cache 中添加某个具有依赖项的项,当依赖项更改时, 17

        

/// 该项将自动从 Cache 中删除。例如,假设您向 Cache 中添加某项, 18

        

/// 并使其依赖于文件名数组。当该数组中的某个文件更改时, 19

        

/// 与该数组关联的项将从缓存中删除。 20

        

/// [C#]  21

        

/// Insert the cache item. 22

        

/// CacheDependency dep = new CacheDependency(fileName, dt); 23

        

/// cache.Insert("key", "value", dep); 24

        

/// </summary> 25

public static readonly int DayFactor = 17280; 26

        

public static readonly int HourFactor = 720; 27

        

public static readonly int MinuteFactor = 12; 28

        

public static readonly double SecondFactor = 0.2; 29

30

        

private static readonly System.Web.Caching.Cache _cache; 31

32

        

private static int Factor = 1440; 33

34

        

/// <summary> 35

        

/// 单件模式 36

        

/// </summary> 37

static BaseCache() 38

        

{ 39

            HttpContext context 

= HttpContext.Current; 40

            

if (context != null) 41

            

{ 42

                _cache 

= context.Cache; 43

            }

44

            

else 45

            

{ 46

                _cache 

= HttpRuntime.Cache; 47

            }

48

        }

49

50

        

/// <summary> 51

        

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

        

/// </summary> 53

public static void Clear() 54

        

{ 55

            IDictionaryEnumerator CacheEnum 

= _cache.GetEnumerator(); 56

            ArrayList al 

= new ArrayList(); 57

            

while (CacheEnum.MoveNext()) //逐个清除 58

{ 59

                al.Add(CacheEnum.Key);

60

            }

61

62

            

foreach (string key in al) 63

            

{ 64

                _cache.Remove(key);

65

            }

66

67

        }

68

69

70

71

        

public static void RemoveByPattern(string pattern) 72

        

{ 73

            IDictionaryEnumerator CacheEnum 

= _cache.GetEnumerator(); 74

            Regex regex 

= new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled); 75

            

while (CacheEnum.MoveNext()) 76

            

{ 77

                

if (regex.IsMatch(CacheEnum.Key.ToString())) 78

                    _cache.Remove(CacheEnum.Key.ToString());

79

            }

80

        }

81

82

        

/// <summary> 83

        

/// 清除特定的缓存 84

        

/// </summary> 85

        

/// <param name="key"></param> 86

public static void Remove(string key) 87

        

{ 88

            _cache.Remove(key);

89

        }

90

91

        

/// <summary> 92

        

/// 缓存OBJECT.  93

        

/// </summary> 94

        

/// <param name="key"></param> 95

        

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

public static void Insert(string key, object obj) 97

        

{ 98

            Insert(key, obj, 

null, 1); 99

        }

100

101

        

/// <summary>102

        

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

        

/// </summary>104

        

/// <param name="key"></param>105

        

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

        

/// <param name="dep"></param>107

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

        

{109

            Insert(key, obj, dep, MinuteFactor 

* 3);110

        }

111

112

        

/// <summary>113

        

/// 按秒缓存对象114

        

/// </summary>115

        

/// <param name="key"></param>116

        

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

        

/// <param name="seconds"></param>118

public static void Insert(string key, object obj, int seconds)119

        

{120

            Insert(key, obj, 

null, seconds);121

        }

122

123

        

/// <summary>124

        

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

        

/// </summary>126

        

/// <param name="key"></param>127

        

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

        

/// <param name="seconds"></param>129

        

/// <param name="priority"></param>130

public static void Insert(string key, object obj, int seconds, CacheItemPriority priority)131

        

{132

            Insert(key, obj, 

null, seconds, priority);133

        }

134

135

        

/// <summary>136

        

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

        

/// </summary>138

        

/// <param name="key"></param>139

        

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

        

/// <param name="dep"></param>141

        

/// <param name="seconds"></param>142

public static void Insert(string key, object obj, CacheDependency dep, int seconds)143

        

{144

            Insert(key, obj, dep, seconds, CacheItemPriority.Normal);

145

        }

146

147

        

/// <summary>148

        

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

        

/// </summary>150

        

/// <param name="key"></param>151

        

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

        

/// <param name="dep"></param>153

        

/// <param name="seconds"></param>154

        

/// <param name="priority"></param>155

public static void Insert(string key, object obj, CacheDependency dep, int seconds, CacheItemPriority priority)156

        

{157

            

if (obj != null)158

            

{159

                _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds(Factor 

* seconds), TimeSpan.Zero, priority, null);160

            }

161

162

        }

163

164

165

        

public static void MicroInsert(string key, object obj, int secondFactor)166

        

{167

            

if (obj != null)168

            

{169

                _cache.Insert(key, obj, 

null, DateTime.Now.AddSeconds(Factor * secondFactor), TimeSpan.Zero);170

            }

171

        }

172

173

        

/// <summary>174

        

/// 最大时间缓存175

        

/// </summary>176

        

/// <param name="key"></param>177

        

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

public static void Max(string key, object obj)179

        

{180

            Max(key, obj, 

null);181

        }

182

183

        

/// <summary>184

        

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

        

/// </summary>186

        

/// <param name="key"></param>187

        

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

        

/// <param name="dep"></param>189

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

        

{191

            

if (obj != null)192

            

{193

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

null);194

            }

195

        }

196

197

        

/// <summary>198

        

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

        

/// </summary>200

        

/// <param name="key"></param>201

        

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

public static void Permanent(string key, object obj)203

        

{204

            Permanent(key, obj, 

null);205

        }

206

207

        

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

        

{209

            

if (obj != null)210

            

{211

                _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.NotRemovable, 

null);212

            }

213

        }

214

215

        

public static object Get(string key)216

        

{217

            

return _cache[key];218

        }

219

220

        

/// <summary>221

        

/// Return int of seconds * SecondFactor222

        

/// </summary>223

public static int SecondFactorCalculate(int seconds)224

        

{225

            

// Insert method below takes integer seconds, so we have to round any fractional values226

return Convert.ToInt32(Math.Round((double)seconds * SecondFactor));227

        }

228

    }

229

}

230

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

1

publicstaticCardShop.Model.Systems GetConfig() 2

    

{ 3

        

const string cacheKey = "WebConfig"; 4

        CardShop.Model.Systems sampleCacheTable 

= Larry.Cache.BaseCache.Get(cacheKey) as CardShop.Model.Systems; 5

        

if (sampleCacheTable == null) 6

        

{ 7

                                  OprationCheck.Message(

"第一次加载使用缓存"); 8

            sampleCacheTable 

= model; 9

            Larry.Cache.BaseCache.Insert(cacheKey, sampleCacheTable, 

24 * Larry.Cache.BaseCache.MinuteFactor);10

        }

11

        

else12

        

{13

            OprationCheck.Message(

"已经加载了缓存不需要再加载");14

        }

15

        

return sampleCacheTable;16

    }

.NET 缓存的设计相关推荐

  1. 最全面的缓存架构设计

    一.缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...

  2. 缓存架构设计细节二三事

    缓存架构设计细节二三事 原创 2016-03-08 58沈剑 架构师之路 本文主要讨论这么几个问题: (1)"缓存与数据库"需求缘起 (2)"淘汰缓存"还是&q ...

  3. 微服务化之缓存的设计

    此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在高并发场景下,需要通过缓存来减少数据库的压力,使得大量的访问进来能够命中缓存,只有少量的需要到数据库层.由于 ...

  4. 缓存层设计套路(一)

    一.背景 对于传统的后端业务场景(或者单机应用)中,访问量以及对响应时间的要求均不高,通常只使用DB即可满足要求.这种架构简单,便于快速部署,很多网站发展初期均考虑使用这种架构.但是随着访问量的上升, ...

  5. OEA中的缓存模块设计

    一般缓存介绍 网上介绍缓存的文章比较多,在这里我就挑点重点说一下. 缓存是信息系统软件硬件设计中常用的设计方法:从底层硬件的CPU结构中的多级缓存,到软件中操作系统中内存管理的设计,再到应用软件中的高 ...

  6. Camstar开发:缓存的设计与实现(整合Redis实例)

    目录 1引言 2实例描述 3开发分析 4 实例类图 5 代码分析 5.1 RedisHelper 5.2 ReceiveOrderCache 5.3 IReceiveOrder 5.4 AbsRece ...

  7. 商品详情页动态渲染系统:大型网站的多机房4级缓存架构设计

    124_大型电商网站的商品详情页的深入分析 之前,咱们也是说在讲解这个商品详情页系统的架构 缓存架构,高可用服务 商品详情页系统,我们只是抽取了其中一部分来讲解,而且还做了很大程度的简化 主要是为了用 ...

  8. YYCache 源码解析(一):使用方法,架构与内存缓存的设计

    YYCache是国内开发者ibireme开源的一个线程安全的高性能缓存组件,代码风格简洁清晰,阅读它的源码有助于建立比较完整的缓存设计的思路,同时也能巩固一下双向链表,线程锁,数据库操作相关的知识. ...

  9. Redis缓存策略设计及常见问题

    Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选 ...

最新文章

  1. 数字化为小零售商带来大商机
  2. 互动整合营销_今天,我们谈谈展会的整合营销!
  3. OpenCV Hit or Miss 击中或没打中的实例(附完整代码)
  4. 【linux】截断日志文件
  5. The Property System
  6. 做了一个画f(x,y)=0函数图像的算法,果断codeplex之
  7. 【Spring源码】Spring Transactional事务:传播机制(Propagation) 介绍 和 源码剖析
  8. linux进入超级管理员权限,一直处于超级管理员权限下
  9. 如何在您的笔记本上搭建View 演示环境 -7.无线配置与连接
  10. 水晶报表技术(3)——.NET 2005 中动态水晶报表的实现
  11. 数据持久化,序列化,反序列化,文件读写1
  12. 3d 模型后缀 互转 和名词解释
  13. 面试被问离职原因该怎么回答?
  14. python嵩天ppt_嵩天python课程笔记1
  15. 地理信息系统GIS的评价
  16. IOS:IOS集成开发和环境的介绍
  17. 可以计算亲戚关系的超级计算器!
  18. ESP8266 系统环境搭建
  19. C# Unsafe code may only appear if compiling with /unsafe
  20. maya 白天室内灯光_Maya Vray室内灯光渲染教程

热门文章

  1. C++Addition rule of probabilities概率加法法则算法(附完整源码)
  2. c语言 百钱买百鸡问题
  3. boot spring 怎么执行hql_spring-boot 中使用graphql的正确姿势
  4. json lib java_Json-lib 进行java与json字符串转换之二
  5. cocos2dx 3.2之Lua打飞机项目
  6. Linux服务器编程之:utime()函数
  7. SDK,NDK,ADT工具下载常用地址
  8. 窗口分析函数_6_计算累加差
  9. 处理字符串_5_字符串里过滤不需要的字符
  10. 操作多个表_6_生成笛卡尔积