胡东升,女皇纪事,c25混凝土塌落度
关于缓存的设计
1、什么情况下用缓存
缓存是提高应用程序性能的最好方法之一。运用缓存可以优化数据查询,避免不必要的网络数据回传,和避免执行不必要的完全相同的数据处理逻辑。在实现缓存的时候我们要确定什么时候装入缓存数据。用异步装入缓存或用批处理方式来避免出现客户端数据延迟。
一般来说在一定时间内请求了相同的业务逻辑而没有变更的话,可以采用缓存来设计。数据请求频繁的的请求不适合采用缓存,如论坛的回复,但是论坛的主题是可以采用缓存设计的。
2、缓存设计的步骤
确定缓存数据结构:即设计中哪些数据用到了缓存,设计这些数据的缓存结构
确定缓存什么数据
确定缓存过期规则和清理
确定如何装入缓存数据
3、示例 community server的缓存类
/// <summary>
/// 缓存obj 并建立依赖项
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="dep"></param>
public static void insert(string key, object obj, cachedependency dep)
{
insert(key, obj, dep, minutefactor * );
}
/// <summary>
/// 按秒缓存对象
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="seconds"></param>
public static void insert(string key, object obj, int seconds)
{
insert(key, obj, null, seconds);
}
/// <summary>
/// 按秒缓存对象 并存储优先级
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="seconds"></param>
/// <param name="priority"></param>
public static void insert(string key, object obj, int seconds, cacheitempriority priority)
{
insert(key, obj, null, seconds, priority);
}
/// <summary>
/// 按秒缓存对象 并建立依赖项
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="dep"></param>
/// <param name="seconds"></param>
public static void insert(string key, object obj, cachedependency dep, int seconds)
{
insert(key, obj, dep, seconds, cacheitempriority.normal);
}
/// <summary>
/// 按秒缓存对象 并建立具有优先级的依赖项
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="dep"></param>
/// <param name="seconds"></param>
/// <param name="priority"></param>
public static void insert(string key, object obj, cachedependency dep, int seconds, cacheitempriority priority)
{
if (obj != null)
{
_cache.insert(key, obj, dep, datetime.now.addseconds(factor * seconds), timespan.zero, priority, null);
}
}
public static void microinsert(string key, object obj, int secondfactor)
{
if (obj != null)
{
_cache.insert(key, obj, null, datetime.now.addseconds(factor * secondfactor), timespan.zero);
}
}
/// <summary>
/// 最大时间缓存
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
public static void max(string key, object obj)
{
max(key, obj, null);
}
/// <summary>
/// 具有依赖项的最大时间缓存
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="dep"></param>
public static void max(string key, object obj, cachedependency dep)
{
if (obj != null)
{
_cache.insert(key, obj, dep, datetime.maxvalue, timespan.zero, cacheitempriority.abovenormal, null);
}
}
/// <summary>
/// insert an item into the cache for the maximum allowed time
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
public static void permanent(string key, object obj)
{
permanent(key, obj, null);
}
public static void permanent(string key, object obj, cachedependency dep)
{
if (obj != null)
{
_cache.insert(key, obj, dep, datetime.maxvalue, timespan.zero, cacheitempriority.notremovable, null);
}
}
public static object get(string key)
{
return _cache[key];
}
/// <summary>
/// return int of seconds * secondfactor
/// </summary>
public static int secondfactorcalculate(int seconds)
{
// insert method below takes integer seconds, so we have to round any fractional values
return convert.toint(math.round((double)seconds * secondfactor));
}
}
}
其实这个类就是一个单件模式的设计 和缓存的公共操作方法,其中cachedependency表示建立缓存依赖项,cacheitempriority表示缓存的优先级。s使用如下
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论