浅谈:关于缓存的问题_白酒网
您的位置:网站首页 > 白酒资讯 >资讯

浅谈:关于缓存的问题

2015-02-14     发布者:高小生
导读例如,当您缓存数据库中所有流派的查询结果并使用这一数据而没有从数据库中获取新数据时,可能就不会注意到其他用户已同时在表中插入了新流派。 缓存的另一问题是不能依赖于缓存中的项。为了使应用程序最小化内存消耗,ASP.NET中的缓存机制不时地自动从缓存

  例如,当您缓存数据库中所有流派的查询结果并使用这一数据而没有从数据库中获取新数据时,可能就不会注意到其他用户已同时在表中插入了新流派。

  缓存的另一问题是不能依赖于缓存中的项。为了使应用程序最小化内存消耗,ASP.NET中的缓存机制不时地自动从缓存中删除旧的或是不常使用的数据。因此,不能依赖于其中的项,即使你是在应用程序启动时插入它们的。

  下面将介绍如何避免这两个问题。

  1. 避免旧数据

  为了避免出现与数据库的原始数据不再同步的旧数据,需要一种方法来使缓存无效。通过使缓存无效,可将数据项从缓存中删除,然后可针对下一请求重新创建。使缓存数据无效的方法有很多。首先,可选择设置一个短暂的缓存持续时间。例如,缓存数据库中的Genres列表10分钟。如果别的用户在这10分钟期间插入新的流派,它将不在Web页面上显示。不过,10分钟后,该列表从缓存中删除,在下一次被请求时用新的数据重新创建。后面将介绍如何使用基于时间的缓存。

  使缓存无效的另一种选择是使用缓存依赖性。通过缓存依赖性,可以在缓存的项与原始数据源之间创建关系。在底层数据源改变时,缓存的项无效,这样在它下次被请求时可重新创建。例如,您可以缓存较大文本或XML文件的内容。可将它插入到缓存中,而不是每次需要时都读取它。然后,将它与一个CacheDependency实例(它将监视源文件)相挂钩。一旦该文件发生改变,就从缓存中删除项,并在下次请求时重新创建。本章最后将介绍如何使用CacheDependency。

  在使用像Microsoft SQL Server这样的数据库时也可以使用缓存依赖性。这意味着,一旦缓存查询的一部分数据改变,缓存项就失效。数据库缓存机制和失效是较宽泛的高级主题。Scott Hanselman在《ASP.NET 3.5高级编程(第5版)(已由清华大学出版社引进并出版,ISBN 978-7-302-18119-4)一书的有关缓存的章节中谈到了此内容。

  2. 不要依赖缓存中的数据

  正如刚看到的,数据项可能会在应用程序的生命周期的不同阶段从缓存中删除。它们会被缓存删除,是因为ASP.NET运行库确定它们不经常使用,无谓地占用宝贵空间。当Web应用程序或Web服务器重启时,会清除整个缓存。数据项也会因为它们的依赖性而被删除。因此,不要依赖于存储在缓存中的项,即使在应用程序生命周期的初期放入了这些数据。

  本章的后面将介绍如何通过Cache API(Application Programming Interface,应用编程接口;可与Cache功能交互的方法)以编程形式使用缓存,不过这里有一个从缓存中检索Review实例的快速示例。该代码没有假定其中有数据项,而是首先检查缓存:

  VB.NET

  Dim reviewId As Integer = Convert.ToInt32(Request.QueryString.Get

  ("ReviewId"))

  Dim myReview As Review

  If Cache("MyReview" + reviewId.ToString()) Is Nothing Then

  Using db As New PlanetWroxDataContext()

  myReview = (From r In db.Reviews _

  Where r.Id = reviewId _

  choose r).Single()

  End Using

  Cache("MyReview" + reviewId.ToString()) = myReview

  End If

  myReview = CType(Cache("MyReview" + reviewId.ToString()), Review)

  C#

  int reviewId = Convert.ToInt32(Request.QueryString.Get("ReviewId"));

  Review myReview;

  if (Cache["MyReview" + reviewId.ToString()] == null)

  {

  using (PlanetWroxDataContext db = new PlanetWroxDataContext())

  {

  myReview = (from r in db.Reviews

  where r.Id == reviewId

  choose r).Single();

  }

  Cache["MyReview" + reviewId.ToString()] = myReview;

  }

  myReview = (Review) Cache["MyReview" + reviewId.ToString()];

  在这个代码段中,通过键(这是静态文字MyReview和被搜索的Review的ID的组合)在缓存中搜索数据项。如果缓存是空的(搜索返回Nothing或null),就使用LINQ查询创建数据项,然后存储在缓存中。

  这是个很好的不依赖缓存中的项的示例代码。它检查缓存,如果其中不存在数据项就先进行创建。本章后面将介绍更多的有关以编程方式访问缓存的内容。

免责声明:本文章由会员“高小生”发布如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系

猜你喜欢

最新文章