带你走进缓存世界

  我们搞程序的多多少少都了解点算法。总体来讲,算法是什么?算法就是“时间”和“空间”的互换策略。我们常常考究一个算法的时间复杂度或空间复杂度,如果我们有绝对足够的时间或空间,那么算法就不需要了,可惜这种条件是不存在的,只是在某些情况下相对来说我们不用去考虑其中一个。今天我们讨论的“缓存”,自然就是“用空间换时间”的算法。 缓存就是把一些数据暂时存放于某些地方,可能是内存,也有可能硬盘。总之,目的就是为了避免某些耗时的操作。我们常见的耗时的操作,比如数据库的查询、一些数据的计算结果,或者是为了减轻服务器的压力。其实减轻压力也是因查询或计算,虽然短耗时,但操作很频繁,累加起来也很长,造成严重排队等情况,服务器抗不住)

  概念性的东西暂就不说了,说多了都是故事。现在我们来谈谈各种缓存。

  初学.NET的朋友开始就会接触到DataSet类,云里雾里的看着DataSet的例子程序,也不管是咋回事,用就是了。其实DataSet就是缓存,当我们去读取一段数据集合的时候,如果每读取一条数据就处理一条的话,那么我们的程序和数据库会一直连接着。假如处理一条数据的耗时可以忽略不计,或者只有你一个人使用这个数据库的话,那么数据库一直连着也无所谓,我们写代码完全可以不用DataSet类。但是事实上不耗时不可能的,如果耗时严重的话,就会一直占用这数据库连接,直到我们处理完毕。如果这种查询过多,连接数就会占用过多,而且数据库在某些操作时会锁住表,这就会造成其他的请求等待,会出现查询超时,程序异常等现象。所以,我们必须先把数据拿出来,再对这些数据进行相关的处理,尽早的关闭数据库连接,好让数据库处理其他的请求。 所以,适时地选用DataSet或DataReader是比较重要的(说明:DataReader就是hold住连接的读取方式)。

  你可能会迷惑,不知不觉中使用了缓存(DataSet),这都是.NET帮你完成的事。可是,你可能还是不太清楚该如何使用缓存,或者说何时使用缓存。不用着急,我们一一来看。

  上面说过,我们缓存的数据无非就是一些数据库的查询、计算结果和频繁查询。那么,我们在实际开发中会碰到哪些这种数据呢? 其实仔细想想这是非常常见的,比如用户登录后的个人资料,当他每次点击连接后造成页面刷新,我们总不能都要去重新查询数据库吧?我们常常用Session来存储这个人的信息,当他退出系统后我们把Session清理掉,所以Session也是缓存,只不过他也是.NET给我们提供好的类,sorry,我又举了一个你不想看到的例子,哈哈。其实Session是私有化的数据,Session的数据访问必须通过SessionID(详情我就不多言了,大家google下),还不足以说明缓存的意义。如果把这个问题延伸下去,假如我们开发的是一个多用户的Blog系统, 每当我们访问其中一个博客时都要去查询这个博主的资料,假如A和B同时访问一个博客时,最理想的状态就是只查询一次,而不是两个人都去访问数据库!是不是呢?其实。。。是也不是!(故事里的事,说是就是,不是也是;说不是就不是,是也不是。 :)。之所以说不是,是因为假如我们的博客网站每天就几个人访问,而且一直发展不起来,我们就没必要用缓存,因为使用缓存带来了更多的开发复杂度,因为每当我们去更新博主的资料的时候不单单要更新数据库的信息,我们还要去处理缓存。但是如果我们的博客访问量非常大,就像博客园似的,如果再不缓存,那数据库服务器早就Gameover了:),那么现在就来看怎么用缓存的吧。

  .NET Framework提供了现成的缓存类供我们使用,常见的是 System.Web.HttpRuntime.Cache。每当我们去执行 BlogDataProvier.GetBlogInfo()方法时(假定这个方法是我们获取博主信息的方法,顾名思义嘛),需要在查询之前先从缓存获取数据,假如数据不存在的话,再去数据库获取,并且把得到的结果存入缓存,并且返回该结果既可。下面我把这个方法的伪代码写出来,好让从来没用过缓存的朋友大致了解一下。

public class SqlDataProvider
{
public static object GetBlogInfo(string username)
{
//这里是从数据库获取BlogInfo
return null;
}
}

public class BlogDataProvider
{
public static object GetBlogInfo(string username)
{
var cacheKey
= "Blog_" + username;
var blog
= CacheHelper.Get(cacheKey);
if (blog == null)
{
blog
= SqlDataProvider.GetBlogInfo(username);
CacheHelper.Set(cacheKey, blog);
}
return blog;
}
}
public class CacheHelper
{
public static object Get(string key)
{
return System.Web.HttpRuntime.Cache.Get(key);
}
public static void Set(string key, object value)
{
System.Web.HttpRuntime.Cache.Insert(key, value);
}
}

NET技术带你走进缓存世界,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。