我是实现高速缓存在一类图书馆,我使用的是一个asp.net 应用程序。

我建立了我的缓目作为一个单独模式与一个静态的方法,以更新的高速缓存这是真的只是装成员的变量/财产与收集的数据,我需要缓存(得到了一些锁定逻辑ofcourse).我想这是一个很好的方式去因为我只可以访问我的数据通过调用

MyCacheObject.Instance.MyDataCollection

我创建一个新的高速缓存对象到存储大量的数据分配通过一些关键。我想说的是我创建一个新的高速缓存,但是这个人会不会载所有的数据,但是存储收集的每个关键的访问。

MyOtherCacheObject.Instance.MyOtherDataCollection(indexkey)

这个时间问题有关的垃圾收集被带起来。因为我存储大量的数据,它不会是一种浪费,如果它得到了gc'ed突然?因为它只是一个单独的模式没有什么是确保数据将在高速缓存。

所以我的问题是什么是最佳做法实施缓处理这种情况?我真的不像一个巨大的复杂解决这个,我知道有的是高速缓存在系统。网络,但那似乎有点关闭,因为这仅仅是一类图书馆,或者你认为是什么?

有帮助吗?

解决方案

在我看来,最好的解决办法具有以下特点:

  • 使用可用的缓存服务提供的平台试图避免写你自己。

  • 不几类图书馆系统。网络,以便有层连贯一致。

  • 但是,如果这类图书馆运行的内部ASP.NET 应用程序的解决方案应该不需要带来的另一个缓执行(例如,企图书馆缓存应用程序方框),而这需要额外的配置和安装。

所以,我会用一个IoC战略以允许这类图书馆使用不同的缓存的实现,基于环境上运行。

假设你一定义你的抽象缓存合同为:

public interface ICacheService 
{
    AddItem(...);
}

你能提供一个执行基于系统。Web:

public AspNetBasedCacheService : ICacheService
{
    AddItem(...)
    {
        // Implementation that uses the HttpContext.Cache object
    }
 }

然后必须实施'发表的'作为单独.注意差别的你的原始的方法是,单只是参考ASP.NET 高速缓存服务基础实施,而不是完整'缓对象。

public class ChacheServiceProvider 
{
    public static IChacheService Instance {get; set;}

}

你会有初始化chaching执行无论是通过执行懒惰的初始化时,或在应用程序的启动(在全球性的。asax.cs)

每域组件将可以使用的出版缓存服务,而不知道它是实现基于系统。网。

// inside your class library:
IChacheService chache = CacheServiceProvider.Instance;
cache.AddItem(...);

我同意,它可能不是最简单的解决方案,但我的目标是利用ASP.NET 缓执行,而不牺牲码耦和灵活性。

我希望我理解你的问题的权利。

其他提示

只要缓存仍然拥有对它的引用,数据就不会被垃圾收集。

此外,不要使用单身人士。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top