代码之家  ›  专栏  ›  技术社区  ›  redcalx

IDistributedCache的多个实例?

  •  1
  • redcalx  · 技术社区  · 6 年前

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

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

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

    顺便说一句,我注意到NCache API提供了为每个缓存项选择性地分配一个groupName和SubName的功能,我认为这正是我想要的。然而,我更喜欢针对IDistributedCache(或类似的)编写代码,以便允许插入替代缓存实现。

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

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

    2 回复  |  直到 5 年前
        1
  •  2
  •   Shaun Luttin    6 年前

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

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

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

    在创业期间注册这些人的情况如下:

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

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

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

    值得一看内置服务注册方法的实现。它们很简单。给你 AddDistributedRedisCache AddDistributedSqlServerCache .

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

    services.AddSingleton<IDistributedCache, SqlServerCache>(); 
    services.Configure(setupAction);
    
        2
  •  1
  •   Shoeb Lodhi    6 年前

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

    但是,当使用IDistributedCache接口时,您仅限于IDistributedCache接口支持的缓存调用。尽管NCache完全支持IDistributedCache接口,但您仍然没有使用组或标记的选项。我将通过IDistributedCache和NCache推荐以下使用组和标记的选项。

    直接与NCache IDistributedCache接口一起使用NCache API。这将允许您使用NCache和IDistributedCache接口所缺乏的其他功能,包括组、标记和其他功能。在这种情况下,您必须跳出IDistributedCache接口才能实现目标。

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