IDistributedCache的多个实例?

时间:2018-06-12 17:03:19

标签: caching asp.net-core

IDistributedCache作为标准API提供,用于从ASP.NET应用程序中访问分布式缓存。提供的API非常简单,基本上将缓存显示为键值对的容器,DistributedCacheEntryOptions提供每个条目的到期选项。

现在让我们说在一个应用程序中有很多不同类型的数据要缓存,其中一些我们可能希望逻辑分组。也许我们希望将某些类型的数据分组,以便我们可以例如选择从缓存中清除所有数据而不影响其他类型的数据,或者我们希望能够将某些类型的数据放在具有高可用性的不同缓存集群中,或者将更多资源放入更高性能等等。

鉴于此,我倾向于拥有一个包含多个IDistributedCache实例的包含对象,每个实例用于逻辑分组。鉴于这似乎是一个常见的要求,我想知道是否有一些标准的方法来实现这种模式。或许建议是将所有内容放入带有复合键的单个缓存中(例如groupName-key),尽管我不希望这样做,因为我认为它限制了缓存层的灵活性。

另外,我注意到NCache API提供了为每个缓存条目选择分配groupName和subGroupName的能力,我认为这正是我想要的。但是我更愿意针对IDistributedCache(或类似的)进行编码,以允许插入替代缓存实现。

也许另一种选择是创建我自己的接口来提供抽象,但是我不能选择使用预先构建的现成IDistributedCache实现(例如来自NCache和Redis)。

2 个答案:

答案 0 :(得分:1)

是的,我还建议NCache分组功能解决您的问题,您可以在添加多个项目时将其分配给多个项目,然后根据需要使用组API管理这些项目。另一个解决方案可能是通过NCache标签,该标签本质上比组更灵活,可用于实现上述用例。

但是,使用IDistributedCache接口时,只能使用IDistributedCache接口支持的缓存调用。虽然,NCache完全支持IDistributedCache接口,但是您仍然没有使用组或标签的选项。我将建议以下用于通过IDistributedCache和NCache使用组和标签的选项。

•直接将NCache API与NCache IDistributedCache接口一起使用。这将允许您使用NCache具有的其他功能以及IDistributedCache接口缺少的其他功能,包括组,标签和其他功能。在这种情况下,您将不得不离开IDistributedCache接口才能达到目标。

•为IDistributedCache创建自己的自定义扩展方法,并在扩展方法中调用NCache组和Tag API来实现此目的。您将继续使用IDistributedCache实现,并将通过自定义扩展方法处理其他功能。

答案 1 :(得分:0)

  

...在一个应用程序中,有许多不同类型的数据要缓存,其中一些我们可能希望逻辑分组。

您可以使用这样的包装器接口对缓存进行分组:

public interface IDistributedCache01 : IDistributedCache { ... }
public interface IDistributedCache02 : IDistributedCache { ... }

启动期间注册的内容如下:

services.AddSingleton<IDistributedCache01, SqlServerCache>();
services.AddSingleton<IDistributedCache02, SqlServerCache>();

然后你可以在构造函数中询问特定的缓存:

public MyController(IDistributedCache01 cache)
{
    _cache = cache;
}

值得研究内置服务注册方法的实现。它们很简单。这里是AddDistributedRedisCacheAddDistributedSqlServerCache

当我们拿出防御性编程时,注册方法是两行代码:

services.AddSingleton<IDistributedCache, SqlServerCache>(); 
services.Configure(setupAction);