【问题标题】:Multiple instances of IDistributedCache?IDistributedCache 的多个实例?
【发布时间】:2018-06-12 17:03:19
【问题描述】:

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

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

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

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

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

另见:https://github.com/aspnet/Extensions/issues/2802

【问题讨论】:

  • "...建议将所有内容放入一个带有复合键(例如 groupName-key)的缓存中,尽管我不希望这样做,因为我认为这会限制缓存层。”这似乎很合理。为什么会限制缓存的灵活性?
  • IDistributedCache 上创建扩展方法以接受额外的密钥分组数据可能更简单。就个人而言,我通常创建依赖于单例缓存的服务,每个服务处理特定数据的缓存并为键添加前缀,例如UserCache 将有一个密钥前缀 USER_。如果您的服务不需要 DI,这可以通过扩展方法轻松实现。

标签: caching asp.net-core


【解决方案1】:

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

您可以使用如下封装接口对缓存进行分组:

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);

【讨论】:

    【解决方案2】:

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

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

    • 直接将 NCache API 与 NCache IDistributedCache 接口一起使用。这将允许您使用 NCache 具有和 IDistributedCache 接口缺少的附加功能,包括组、标签和其他功能。在这种情况下,您必须走出 IDistributedCache 接口才能实现目标。

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

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 2018-09-16
      • 2015-10-20
      • 1970-01-01
      相关资源
      最近更新 更多