.NET缓存设计的使用说明
关于缓存的设计
1、什么情况下用缓存
缓存是提高应用程序性能的最好方法之一。运用缓存可以优化数据查询,避免不必要的网络数据回传,和避免执行不必要的完全相同的数据处理逻辑。在实现缓存的时候我们要确定什么时候装入缓存数据。用异步装入缓存或用批处理方式来避免出现客户端数据延迟。
一般来说在一定时间内请求了相同的业务逻辑而没有变更的话,可以采用缓存来设计。数据请求频繁的的请求不适合采用缓存,如论坛的回复,但是论坛的主题是可以采用缓存设计的。
2、缓存设计的步骤
确定缓存数据结构:即设计中哪些数据用到了缓存,设计这些数据的缓存结构
确定缓存什么数据
确定缓存过期规则和清理
确定如何装入缓存数据
3、示例CommunityServer的缓存类
usingSystem;
usingSystem.Collections;
usingSystem.Text.RegularExpressions;
usingSystem.Web;
usingSystem.Web.Caching;
namespaceLarry.Cache
{
///<summary>
///缓存类CommunityServer的缓存类
///</summary>
publicclassBaseCache
{
///<summary>
///CacheDependency说明
///如果您向Cache中添加某个具有依赖项的项,当依赖项更改时,
///该项将自动从Cache中删除。例如,假设您向Cache中添加某项,
///并使其依赖于文件名数组。当该数组中的某个文件更改时,
///与该数组关联的项将从缓存中删除。
///[C#]
///Insertthecacheitem.
///CacheDependencydep=newCacheDependency(fileName,dt);
///cache.Insert("key","value",dep);
///</summary>
publicstaticreadonlyintDayFactor=;
publicstaticreadonlyintHourFactor=;
publicstaticreadonlyintMinuteFactor=;
publicstaticreadonlydoubleSecondFactor=0.;
privatestaticreadonlySystem.Web.Caching.Cache_cache;
privatestaticintFactor=;
///<summary>
///单件模式
///</summary>
staticBaseCache()
{
HttpContextcontext=HttpContext.Current;
if(context!=null)
{
_cache=context.Cache;
}
else
{
_cache=HttpRuntime.Cache;
}
}
///<summary>
///一次性清除所有缓存
///</summary>
publicstaticvoidClear()
{
IDictionaryEnumeratorCacheEnum=_cache.GetEnumerator();
ArrayListal=newArrayList();
while(CacheEnum.MoveNext())//逐个清除
{
al.Add(CacheEnum.Key);
}
foreach(stringkeyinal)
{
_cache.Remove(key);
}
}
publicstaticvoidRemoveByPattern(stringpattern)
{
IDictionaryEnumeratorCacheEnum=_cache.GetEnumerator();
Regexregex=newRegex(pattern,RegexOptions.IgnoreCase|RegexOptions.Singleline|RegexOptions.Compiled);
while(CacheEnum.MoveNext())
{
if(regex.IsMatch(CacheEnum.Key.ToString()))
_cache.Remove(CacheEnum.Key.ToString());
}
}
///<summary>
///清除特定的缓存
///</summary>
///<paramname="key"></param>
publicstaticvoidRemove(stringkey)
{
_cache.Remove(key);
}
///<summary>
///缓存OBJECT.
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
publicstaticvoidInsert(stringkey,objectobj)
{
Insert(key,obj,null,);
}
///<summary>
///缓存obj并建立依赖项
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
///<paramname="dep"></param>
publicstaticvoidInsert(stringkey,objectobj,CacheDependencydep)
{
Insert(key,obj,dep,MinuteFactor*);
}
///<summary>
///按秒缓存对象
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
///<paramname="seconds"></param>
publicstaticvoidInsert(stringkey,objectobj,intseconds)
{
Insert(key,obj,null,seconds);
}
///<summary>
///按秒缓存对象并存储优先级
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
///<paramname="seconds"></param>
///<paramname="priority"></param>
publicstaticvoidInsert(stringkey,objectobj,intseconds,CacheItemPrioritypriority)
{
Insert(key,obj,null,seconds,priority);
}
///<summary>
///按秒缓存对象并建立依赖项
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
///<paramname="dep"></param>
///<paramname="seconds"></param>
publicstaticvoidInsert(stringkey,objectobj,CacheDependencydep,intseconds)
{
Insert(key,obj,dep,seconds,CacheItemPriority.Normal);
}
///<summary>
///按秒缓存对象并建立具有优先级的依赖项
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
///<paramname="dep"></param>
///<paramname="seconds"></param>
///<paramname="priority"></param>
publicstaticvoidInsert(stringkey,objectobj,CacheDependencydep,intseconds,CacheItemPrioritypriority)
{
if(obj!=null)
{
_cache.Insert(key,obj,dep,DateTime.Now.AddSeconds(Factor*seconds),TimeSpan.Zero,priority,null);
}
}
publicstaticvoidMicroInsert(stringkey,objectobj,intsecondFactor)
{
if(obj!=null)
{
_cache.Insert(key,obj,null,DateTime.Now.AddSeconds(Factor*secondFactor),TimeSpan.Zero);
}
}
///<summary>
///最大时间缓存
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
publicstaticvoidMax(stringkey,objectobj)
{
Max(key,obj,null);
}
///<summary>
///具有依赖项的最大时间缓存
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
///<paramname="dep"></param>
publicstaticvoidMax(stringkey,objectobj,CacheDependencydep)
{
if(obj!=null)
{
_cache.Insert(key,obj,dep,DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.AboveNormal,null);
}
}
///<summary>
///InsertanitemintothecachefortheMaximumallowedtime
///</summary>
///<paramname="key"></param>
///<paramname="obj"></param>
publicstaticvoidPermanent(stringkey,objectobj)
{
Permanent(key,obj,null);
}
publicstaticvoidPermanent(stringkey,objectobj,CacheDependencydep)
{
if(obj!=null)
{
_cache.Insert(key,obj,dep,DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.NotRemovable,null);
}
}
publicstaticobjectGet(stringkey)
{
return_cache[key];
}
///<summary>
///Returnintofseconds*SecondFactor
///</summary>
publicstaticintSecondFactorCalculate(intseconds)
{
//Insertmethodbelowtakesintegerseconds,sowehavetoroundanyfractionalvalues
returnConvert.ToInt(Math.Round((double)seconds*SecondFactor));
}
}
}
其实这个类就是一个单件模式的设计和缓存的公共操作方法,其中CacheDependency表示建立缓存依赖项,CacheItemPriority表示缓存的优先级。S使用如下
publicstaticCardShop.Model.SystemsGetConfig()
{
conststringcacheKey="WebConfig";
CardShop.Model.SystemssampleCacheTable=Larry.Cache.BaseCache.Get(cacheKey)asCardShop.Model.Systems;
if(sampleCacheTable==null)
{
OprationCheck.Message("第一次加载使用缓存");
sampleCacheTable=model;
Larry.Cache.BaseCache.Insert(cacheKey,sampleCacheTable,24*Larry.Cache.BaseCache.MinuteFactor);
}
else
{
OprationCheck.Message("已经加载了缓存不需要再加载");
}
returnsampleCacheTable;
}
相关文章
- 用.NET开发的磁力搜索引擎——btbook.net「建议收藏」
- .net 温故知新:【9】.NET日志记录 ILogger使用和原理
- ASP.NET Core 6框架揭秘实例演示[34]:缓存整个响应内容
- .NET性能优化-使用内存+磁盘混合缓存
- .NET周报【12月第3期 2022-12-23】
- LLDB Debug .Net 7 In Ubunt22.04 for Exception
- 【愚公系列】2023年03月 .NET CORE工具案例-基于CacheManager缓存中间件
- .NET Core 2.0版本预计于2017年春季发布详解编程语言
- 利用Oracle.Net实现数据库互联(oracle.net)
- 数据库使用.NET连接MySQL数据库(net连接mysql)
- .Net程序开发利用Redis提高效率(.net使用redis)
- 跨平台利器:.NET在Linux上的运行(.net运行在linux)
- Oracle NET突破技术界限,精彩开启新纪元(oracle net??)
- .Net搭配Redis解决高性能应用问题(.net redis)
- 基于NET技术的Oracle信息服务(.net用oracle)
- Net开发Oracle数据库新技术攻关挑战(.net开发oracle)
- NET技术结合MySQL实现数据库访问极致体验(.net数据库mysql)
- NET环境下MySQL数据库的使用实践(.net支持mysql吗)
- 使用NET来连接MySQL数据库的简单方法(.net怎么连mysql)
- Redis无法安装NET组件(redis装不上net)
- asp.net页面输出缓存
- asp.net使用驻留在页面中的Cache缓存常用可定时更新的数据
- asp.net下用Aspose.Wordsfor.NET动态生成word文档中的数据表格的方法
- ASP.NET性能优化之局部缓存分析
- asp.net中Session缓存与Cache缓存的区别分析
- ASP.NET解决上传大文件问题的方法
- asp.netC#生成和解析二维码的实例代码
- .NET命令行解析器示例程序(命令行选项功能)
- .net/c#memcached缓存获取所有缓存键的方法步骤