2

我将一个列表插入到 ASP.Net 中的数据缓存中,如下面的示例代码所示。我使用 C# 作为编程语言。

我无法找到以下问题的解决方案:

  1. 启动一个可能持续 0.1 秒到 20 秒的长数据库操作。
  2. 在此操作结束时,我需要确定名称为“dSummary”的缓存是否在长时间操作开始后(即操作正在进行时)被重新插入或从数据库刷新。

我用来插入缓存项的代码如下:

      List<Doc> ds = GetDocSummary();
   System.Web.HttpContext.Current.Cache.Insert("dSummary", ds, null, 
           DateTime.Now.AddMinutes(15), System.Web.Caching.Cache.NoSlidingExpiration);

更新 1:

在收到这么多回复后,我认为一种可能的万无一失的方法是将 guid 字符串与 List 对象一起存储在缓存中。然后我可以简单地比较长操作前后存储在Cache中的对象的guid字符串属性。如果它们相同,则尚未重新插入 Cache["dSummary"],否则已重新插入。所以我需要使用“Doc”类的以下扩展类。

public class DocX : Doc
 { 
          public UniQueIdentifier { get;set; }
          public DocX ( Doc doc, string unqiueIdentifier)
             {
                  this.Doc = doc;
                  this.UniqueIdentifier = unqiueIdentifier;

            }
 }

然后我将使用以下代码插入缓存:

       List<Doc> ds = GetDocSummary();
       System.Web.HttpContext.Current.Cache.Insert("dSummary",new DocX( ds,  
                new Guid.Newguid().ToString() ), null, 
           DateTime.Now.AddMinutes(15), System.Web.Caching.Cache.NoSlidingExpiration);
4

3 回答 3

2

我会在您添加或更新包含您修改它的时间戳的 dSummary 时添加另一个 Cache 属性。

您可以在长时间运行的操作开始时记录原始值,并在结束时将其与缓存中的当前值进行比较;如果值不同,则更新数据。

于 2013-01-01T20:51:58.737 回答
1

在开始操作之前,GetDocSummary()您可以从缓存中获取当前值并将该值(或来自该值的哈希,如果内存可能是一个问题)存储在局部变量中。操作完成后,在将数据添加到缓存之前,将局部变量与当前缓存的值进行比较。

根据评论添加一些示例,使用Tuple

var cacheEntry = new Tuple<List<Doc>, DateTime>(ds, DateTime.Now);

执行后GetDocSummary(),从缓存中获取您的条目并查看日期是否介于开始和结束此操作之间。

于 2013-01-01T21:12:33.870 回答
1

假设有两个或更多线程想要获取文档摘要,我猜您不希望所有线程都计算摘要(正如您所说,这是一个长时间运行的计算密集型操作)。在这种情况下,我采用以下解决方案:

//declare lock object for implementing critical section
private static object docSummaryLock = new object();

//this is the body of GetDocSummary method
List<Doc> ds = (List<Doc>) System.Web.HttpContext.Current.Cache.Get("dSummary");
if (ds != null) return ds;
//summary not found in cache, computing the doc summary occurs in critical section
lock (docSummaryLock)
{
    //there is possibility that another thread waited for obtaining the lock and the summary may be already in cache
    ds = (List<Doc>) System.Web.HttpContext.Current.Cache.Get("dSummary");
    if (ds != null) return ds;

    //compute the summary
    ds = GetDocSummary();
    System.Web.HttpContext.Current.Cache.Insert("dSummary", summaries, null, 
    DateTime.Now.AddMinutes(15), System.Web.Caching.Cache.NoSlidingExpiration);
    return ds;
}
于 2013-01-01T21:03:17.717 回答