Несколько экземпляров IDistributedCache? - PullRequest
0 голосов
/ 12 июня 2018

IDistributedCache предоставляется в качестве стандартного API для доступа к распределенным кешам из приложений ASP.NET.Предоставленный API-интерфейс очень прост, в основном он представляет кэш в виде контейнера пар ключ-значение, а DistributedCacheEntryOptions предоставляет параметры истечения срока действия для каждой записи.

Теперь, скажем, в одном приложении естьмножество различных типов данных для кэширования, некоторые из которых мы можем сгруппировать логически.Может быть, мы хотим, чтобы некоторые типы данных были сгруппированы, чтобы мы могли, например, выбрать удаление всех данных из кэша, не затрагивая другие типы данных, или, возможно, нам нужна возможность помещать некоторые типы данных в другой кластер кэша с высокой доступностью,или больше ресурсов для повышения производительности и т. д.

Учитывая это, я склоняюсь к наличию содержащего объекта, который содержит несколько экземпляров IDistributedCache, по одному для логической группировки.Учитывая, что это кажется обычным требованием, мне интересно, есть ли какой-нибудь стандартный способ достижения этого паттерна.Или, может быть, советом было бы поместить все в один кеш с составным ключом (например, groupName-key), хотя я бы предпочел не делать этого, так как считаю, что это ограничивает гибкость слоя кэширования.

Кроме того, я заметил, что API-интерфейс NCache предоставляет возможность произвольно назначать groupName и subGroupName для каждой записи в кэше, что, я думаю, в значительной степени то, что я хочу.Однако я предпочел бы кодировать против IDistributedCache (или аналогичного), чтобы обеспечить альтернативные реализации кэширования.

Возможно, другой вариант - создать собственный интерфейс для обеспечения абстракции, но тогда я не будуt выбор варианта использования готовых реализаций IDistributedCache (например, из NCache и Redis).

Ответы [ 2 ]

0 голосов
/ 06 августа 2018

Да, я также собирался предложить, чтобы функция группирования NCache разрешила вашу проблему: вы можете назначать группы нескольким элементам при их добавлении, а затем использовать API групп для управления этими элементами по мере необходимости.Другим решением может быть использование тегов NCache, которые даже более гибки по своей природе, чем группы, и могут использоваться для достижения упомянутого варианта использования.

Однако при использовании интерфейса IDistributedCache вы ограничены вызовами кеша, которые поддерживаются с помощьюИнтерфейс IDistributedCache.Хотя NCache полностью поддерживает интерфейс IDistributedCache, но у вас все еще нет возможности использовать группы или теги.Ниже я предложу варианты использования групп и тегов через IDistributedCache с NCache.

• Используйте API-интерфейсы NCache напрямую вместе с интерфейсом NCache IDistributedCache.Это позволит вам использовать дополнительные функции, которые есть у NCache и интерфейса IDistributedCache, включая группы, теги и другие функции.В этом случае вам придется выйти за пределы интерфейса IDistributedCache, чтобы достичь цели.

• Создайте собственные методы расширения для IDistributedCache и вызовите группы NCache и API-интерфейсы тегов в методе расширения для достижения этой цели.Вы останетесь в своей реализации IDistributedCache и получите дополнительные функциональные возможности, которые будут обрабатываться с помощью пользовательских методов расширения.

0 голосов
/ 12 июня 2018

... в одном приложении существует множество различных типов данных для кэширования, некоторые из которых мы можем сгруппировать логически.

Вы можете сгруппировать свои кэши с помощьюИнтерфейсы-оболочки, такие как:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...