.NET 缓存的设计
关于缓存的设计
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.Current; 40
if (context != null) 41
{ 42
= context.Cache; 43
44
else 45
{ 46
= HttpRuntime.Cache; 47
48
49
50
/// <summary> 51
/// 一次性清除所有缓存 52
/// </summary> 53
public static void Clear() 54
{ 55
= _cache.GetEnumerator(); 56
= new ArrayList(); 57
while (CacheEnum.MoveNext()) //逐个清除 58
{ 59
60
61
62
foreach (string key in al) 63
{ 64
65
66
67
68
69
70
71
public static void RemoveByPattern(string pattern) 72
{ 73
= _cache.GetEnumerator(); 74
= new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled); 75
while (CacheEnum.MoveNext()) 76
{ 77
if (regex.IsMatch(CacheEnum.Key.ToString())) 78
79
80
81
82
/// <summary> 83
/// 清除特定的缓存 84
/// </summary> 85
/// <param name="key"></param> 86
public static void Remove(string key) 87
{ 88
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
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
* 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
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
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
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
* 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
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
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
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
null);205
206
207
public static void Permanent(string key, object obj, CacheDependency dep)208
{209
if (obj != null)210
{211
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使用如下
publicstaticCardShop.Model.Systems GetConfig() 2
{ 3
const string cacheKey = "WebConfig"; 4
= Larry.Cache.BaseCache.Get(cacheKey) as CardShop.Model.Systems; 5
if (sampleCacheTable == null) 6
{ 7
"第一次加载使用缓存"); 8
= model; 9
24 * Larry.Cache.BaseCache.MinuteFactor);10
11
else12
{13
"已经加载了缓存不需要再加载");14
15
return sampleCacheTable;16
.NET 缓存的设计相关推荐
- 最全面的缓存架构设计
一.缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...
- 缓存架构设计细节二三事
缓存架构设计细节二三事 原创 2016-03-08 58沈剑 架构师之路 本文主要讨论这么几个问题: (1)"缓存与数据库"需求缘起 (2)"淘汰缓存"还是&q ...
- 微服务化之缓存的设计
此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在高并发场景下,需要通过缓存来减少数据库的压力,使得大量的访问进来能够命中缓存,只有少量的需要到数据库层.由于 ...
- 缓存层设计套路(一)
一.背景 对于传统的后端业务场景(或者单机应用)中,访问量以及对响应时间的要求均不高,通常只使用DB即可满足要求.这种架构简单,便于快速部署,很多网站发展初期均考虑使用这种架构.但是随着访问量的上升, ...
- OEA中的缓存模块设计
一般缓存介绍 网上介绍缓存的文章比较多,在这里我就挑点重点说一下. 缓存是信息系统软件硬件设计中常用的设计方法:从底层硬件的CPU结构中的多级缓存,到软件中操作系统中内存管理的设计,再到应用软件中的高 ...
- Camstar开发:缓存的设计与实现(整合Redis实例)
目录 1引言 2实例描述 3开发分析 4 实例类图 5 代码分析 5.1 RedisHelper 5.2 ReceiveOrderCache 5.3 IReceiveOrder 5.4 AbsRece ...
- 商品详情页动态渲染系统:大型网站的多机房4级缓存架构设计
124_大型电商网站的商品详情页的深入分析 之前,咱们也是说在讲解这个商品详情页系统的架构 缓存架构,高可用服务 商品详情页系统,我们只是抽取了其中一部分来讲解,而且还做了很大程度的简化 主要是为了用 ...
- YYCache 源码解析(一):使用方法,架构与内存缓存的设计
YYCache是国内开发者ibireme开源的一个线程安全的高性能缓存组件,代码风格简洁清晰,阅读它的源码有助于建立比较完整的缓存设计的思路,同时也能巩固一下双向链表,线程锁,数据库操作相关的知识. ...
- Redis缓存策略设计及常见问题
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选 ...
最新文章
- 数字化为小零售商带来大商机
- 互动整合营销_今天,我们谈谈展会的整合营销!
- OpenCV Hit or Miss 击中或没打中的实例(附完整代码)
- 【linux】截断日志文件
- The Property System
- 做了一个画f(x,y)=0函数图像的算法,果断codeplex之
- 【Spring源码】Spring Transactional事务:传播机制(Propagation) 介绍 和 源码剖析
- linux进入超级管理员权限,一直处于超级管理员权限下
- 如何在您的笔记本上搭建View 演示环境 -7.无线配置与连接
- 水晶报表技术(3)——.NET 2005 中动态水晶报表的实现
- 数据持久化,序列化,反序列化,文件读写1
- 3d 模型后缀 互转 和名词解释
- 面试被问离职原因该怎么回答?
- python嵩天ppt_嵩天python课程笔记1
- 地理信息系统GIS的评价
- IOS:IOS集成开发和环境的介绍
- 可以计算亲戚关系的超级计算器!
- ESP8266 系统环境搭建
- C# Unsafe code may only appear if compiling with /unsafe
- maya 白天室内灯光_Maya Vray室内灯光渲染教程
热门文章
- C++Addition rule of probabilities概率加法法则算法(附完整源码)
- c语言 百钱买百鸡问题
- boot spring 怎么执行hql_spring-boot 中使用graphql的正确姿势
- json lib java_Json-lib 进行java与json字符串转换之二
- cocos2dx 3.2之Lua打飞机项目
- Linux服务器编程之:utime()函数
- SDK,NDK,ADT工具下载常用地址
- 窗口分析函数_6_计算累加差
- 处理字符串_5_字符串里过滤不需要的字符
- 操作多个表_6_生成笛卡尔积