ASP.NET缓存问题

时间:2009-05-14 08:01:14

标签: asp.net caching cache-dependency

我的缓存中有两个项目

  1. Key:Cat
  2. Key:Animal_Vacinations
  3. 现在,Animal_VacinationsCat上有一个基于密钥的缓存依赖。因此,如果缓存项Cat发生任何变化,则缓存项Animal_Vacinations将失效。完美:))

    好的..现在问题。

    在我创建第二个缓存项(即Animal_Vacinations)之后,我添加了一个第三个​​缓存对象: -

    1. 钥匙:狗
    2. 问题是,第二个对象也需要依赖Dog。在创建第二个对象时,它知道它应该依赖哪些项目。所以在这个例子中,Animal_Vacination对象知道它应该依赖于......

      1. Jon Skeet
      2. 问题是,如果我尝试将Animal_Vacination对象插入具有所有这4个依赖项的缓存中,则会失败。没有错误,只是失败。 (即Cache["Animal_Vacination"] == null)。

        原因是,当我插入具有这4个依赖项的缓存对象... 但是这些依赖项中的一个或多个不存在_ ...它会正常失败。

        长号。

        因为在上面的例子中,在添加2个对象之后立即添加了其中一个缺少的三个对象。

        所以......无论如何都要将对象添加到缓存中,使用基于密钥的缓存依赖关系,其中尚未创建一个或多个依赖关系,但可能会在以后创建?

2 个答案:

答案 0 :(得分:1)

我不愿意称之为答案,因为它会做出一些假设,这些假设可能首先应该通过其他问题加以澄清,但是这里也是如此。

假设有一段代码负责使用密钥“Animal_Vacinations”向缓存添加内容,并且该代码知道“Animal_Vacinations”项依赖于它的其他缓存项,那么该代码应该创建每个必要的缓存密钥依赖关系,包括如果需要,为任何尚未在那里找到的依赖项添加Null对象到缓存。

因此,例如,在您给出的示例中,在添加“Animal_Vacinations”之前缓存中已经有“Cat”,那么负责将“Animal_Vacinations”添加到缓存的逻辑应该检查缓存是否存在每个依赖项目,即“猫”,“狗”,“鸟”,“Jon Skeet”;当找不到一个时,应该将一个占位符对象或盒装值(可能是空字符串)添加到该键的缓存中(在本例中,为“Dog”,“Bird”和“Jon Skeet”);一旦所有依赖项存在于缓存中,则创建缓存依赖项并将“Animal_Vacinations”添加到缓存中。 (或者,使用占位符对象为每个所需的依赖键调用Cache.Add,而不首先检查它们是否与Get一起存在,并使用异常处理程序来吞下抛出的异常(如果它已经存在)。)

继续你的例子,当在这个活动之后,使用“Dog”键将一个真实的东西添加到缓存中,使用Insert而不是Add来说明密钥已经存在的可能性(就像在这里一样)例如),然后替换“Dog”缓存项(它只是一个Null值)将触发“Animal_Vacinations”缓存项按其缓存依赖项失效。

答案 1 :(得分:0)

您可以执行的操作是在添加实际项目后添加依赖项。所以它就像这样:
添加钥匙猫
添加关键Animal_Vacinations
为Animal_Vacinations添加缓存依赖性 添加关键狗 编辑Animal_Vacinations的缓存依赖性,使其包含dog。
添加关键鸟 编辑Animal_Vacinations的缓存依赖性,使其包含Bird,
等等...