在Web缓存(.NET)中对类似对象进行分组?

时间:2009-11-03 17:04:59

标签: .net caching

  • 我有一堆对象,我想要存储在Web缓存中。
  • 可能有几百个这样的物体。
  • 我希望对象具有各自的到期时间,并从缓存中单独过期。
  • 我希望能够告诉缓存中有多少这些对象,并单独迭代这些对象(无论缓存中的其他类型如何)。

最初我考虑过将一个通用集合存储在缓存中,并在需要时将对象插入到集合中。这很好,很整洁,可以使迭代变得容易。但是,这不允许每个对象单独过期(整个集合将过期)。我想在这种情况下我必须创建自己的到期机制和“垃圾收集”。

我的第二个想法是将每个对象存储为缓存的第一类公民。这显然会让他们单独过期,但看起来有点乱。如何迭代它们?也许只是迭代整个缓存,并寻找正确的类型(不确定这将工作),或使用键前缀。这是我认为最容易的,但似乎并不理想。

我想我真正想要的是一种将缓存项目组合在一起的方法,但是要让它们保留缓存项目。我认为像子缓存这样的东西。

有人能提出最好的前进方向吗?

2 个答案:

答案 0 :(得分:1)

您可以创建一个包装类并以这种方式引用缓存的项目。

示例:

public interface IExample
{
    string FirstProperty { get; set; }
    string SecondProperty { get; set; }
}

public class OriginalClass : IExample
{
    public string FirstProperty { get; set; }
    public string SecondProperty { get; set; }
}

public class CachedClass : IExample
{
    //initialize this somewhere
    private OriginalClass Wrapped { get; set;}

    public string FirstProperty
    {
        get
        {
            return Cache["FirstProperty"];
        }
        set
        {
            Wrapped.FirstProperty = value;
            Cache["FirstProperty"] = value;
        }
    }

    public string SecondProperty
    {
        get
        {
            return Cache["SecondProperty"];
        }
        set
        {
            Wrapped.SecondProperty= value;
            Cache["SecondProperty"] = value;
        }
    }
}

您需要添加一些额外的逻辑来检查缓存是否为空,但您明白了。

答案 1 :(得分:0)

我已经做了类似的事情,通过实现一个CacheManager类来管理ASP.NET缓存中的一组相关项。

每个CacheManager实例使用前缀到缓存键的唯一前缀来标识它管理的项目。因此,您可以通过迭代整个缓存并查找唯一的前缀来识别和计算组中的项目。 (但这可能代价很高,因此如果您想频繁迭代组中的项目,您可能希望查看不同的解决方案,例如对组中缓存项目的弱引用集合。)

组中的项目单独存储在缓存中,因此可以有自己的到期时间(尽管我的实现为组中的每个项目提供了相同的到期时间。)

我还可以选择在单个缓存键上实现CacheDependency,这对每个CacheManager都是唯一的。这样就可以从缓存中轻松清除组中的所有项目。