【问题标题】:Grouping similar objects in web cache (.NET)?在 Web 缓存 (.NET) 中对类似对象进行分组?
【发布时间】:2011-04-18 17:43:56
【问题描述】:
  • 我有一堆对象都属于一个类,我想将它们存储在网络缓存中。
  • 可能有几百个这样的对象。
  • 我希望对象有自己的到期时间,并分别从缓存中到期。
  • 我希望能够知道这些对象中有多少在缓存中,并单独迭代这些对象(不管缓存中的其他类型如何)。

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

我的第二个想法是将每个对象存储为缓存的一等公民。这显然会允许它们单独过期,但似乎有点混乱。如何迭代它们?也许只是遍历整个缓存,并寻找正确的类型(不确定这是否可行),或者使用键前缀。我想这将是最简单的,但似乎并不理想。

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

谁能建议最好的前进方式?

【问题讨论】:

    标签: .net caching


    【解决方案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;
            }
        }
    }
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-01-13
        • 2020-12-03
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多