IDistributedCache 的多个实例?

red*_*alx 5 caching asp.net-core

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

现在,假设在一个应用程序中,有许多不同类型的数据需要缓存,我们可能希望对其中一些数据进行逻辑分组。也许我们希望对某些类型的数据进行分组,以便我们可以选择将其全部从缓存中刷新而不影响其他类型的数据,或者也许我们希望能够将某些类型的数据放入具有高可用性的不同缓存集群中,或更多资源以获得更好的性能等。

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

顺便说一句,我注意到 NCache API 提供了有选择地为每个缓存条目分配 groupName 和 subGroupName 的能力,我认为这正是我想要的。不过,我更喜欢针对 IDistributedCache(或类似的)进行编码,以便允许插入式替代缓存实现。

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

另请参阅: https: //github.com/aspnet/Extensions/issues/2802

Sha*_*tin 2

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

您可以使用包装器接口对缓存进行分组,如下所示:

public interface IDistributedCache01 : IDistributedCache { ... }
public interface IDistributedCache02 : IDistributedCache { ... }
Run Code Online (Sandbox Code Playgroud)

在启动期间注册这些内容将如下所示:

services.AddSingleton<IDistributedCache01, SqlServerCache>();
services.AddSingleton<IDistributedCache02, SqlServerCache>();
Run Code Online (Sandbox Code Playgroud)

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

public MyController(IDistributedCache01 cache)
{
    _cache = cache;
}
Run Code Online (Sandbox Code Playgroud)

值得一看的是内置服务注册方法的实现。它们非常简单。这里它们用于AddDistributedRedisCacheAddDistributedSqlServerCache

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

services.AddSingleton<IDistributedCache, SqlServerCache>(); 
services.Configure(setupAction);
Run Code Online (Sandbox Code Playgroud)