在高并发的现代Web系统中,缓存体系是绕不开的话题。一直以来我们开发的系统处于内网环境中,而且服务器资源相对负载来说比较富裕,从未使用缓存。大型的Web系统往往会使用MemCache,Redis等缓存数据库来加速访问,还有诸如全站静态化和CDN等技术。而受制于技术复杂度。小型Web使用.NET自带的缓存技术,也可以非常好的提高访问速度。
在油水井图片库这个项目中,由于在模糊查询中不当的应用了Count()方法。导致模糊查询偶尔会失去响应。于是在这个系统中加了一层简单的缓存。
缓存本质很简单,就是将原始数据预读到一个可以高速访问的区域一般就是内存中。
使用缓存的代价就是要维护原始数据与缓存的同步,在做各种增删改操作的时候需要一并更新缓存。缓存可以分为页面/文件缓存和数据缓存。
ASP.NET MVC对.NET缓存进行了一层包装,可以很优雅的对页面进行缓存。缓存数据代码如下:
在油水井图片库这个项目中,由于在模糊查询中不当的应用了Count()方法。导致模糊查询偶尔会失去响应。于是在这个系统中加了一层简单的缓存。
缓存本质很简单,就是将原始数据预读到一个可以高速访问的区域一般就是内存中。
使用缓存的代价就是要维护原始数据与缓存的同步,在做各种增删改操作的时候需要一并更新缓存。缓存可以分为页面/文件缓存和数据缓存。
ASP.NET MVC对.NET缓存进行了一层包装,可以很优雅的对页面进行缓存。缓存数据代码如下:
public class CacheHelper
{
/// <summary>
/// 获取数据缓存
/// </summary>
/// <param name="CacheKey">键</param>
public static object GetCache(string CacheKey)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
return objCache[CacheKey];
}
/// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject); //永不过期
}
/// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject, TimeSpan Timeout)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject, null, DateTime.MaxValue, Timeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
}
/// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
}
/// <summary>
/// 移除指定数据缓存
/// </summary>
public static void RemoveAllCache(string CacheKey)
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
_cache.Remove(CacheKey);
}
/// <summary>
/// 移除全部缓存
/// </summary>
public static void RemoveAllCache()
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
while (CacheEnum.MoveNext())
{
_cache.Remove(CacheEnum.Key.ToString());
}
}
}
由于我们的缓存是后加的,因此需要在某处执行一个初始化的过程。结果发现,在内存中初始化缓存的执行时间长达2分钟!以至Ajax请求超时。最后解决了这个问题。当缓存初始化成功后,模糊查询的执行速度得到了很大提升。我们把两个程序发布到服务器的不同端口上,在其他外部条件完全一致的情况下对访问时间进行了比较:
未使用缓存之前:
在实测中发现请求页面时,速度几乎没有提升。可能是因为页面本身就非常简单,提速不明显。而请求数据时速度提升非常大。通过图片可以很清楚的看到,加上缓存后,响应时间下降了80%-90%,某些情况下甚至下降到了5%。达到了预期目的。