Microsoft Distrubted Redis Cache - получение ключей на основе шаблона - PullRequest
0 голосов
/ 25 октября 2018

Мы работаем с реализацией Microsoft Distrbuted Cache для ядра .net.См. https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-2.1 для получения дополнительной информации.

Теперь мы можем получить ключ по следующему коду.

var cacheKey = "application:customer:1234:profile";
var profile = _distributedCache.GetString(cacheKey);

Что я хочу сделать, это сделать следующее:

var cacheKey = "application:customer:1234:*";
var customerData = _distributedCache.GetString(cacheKey);

Чтобы мы могли получить следующие ключи с этим шаблоном:

  • приложение: клиент: 1234: профиль
  • приложение: клиент: 1234: заказы
  • приложение: клиент: 1234: счета-фактуры
  • приложение: клиент: 1234: платежи

Не удалось получить эту работу с любым подстановочным знаком или без подстановочного знака.Есть ли решение без реализации другого пакета Redis nuget?

1 Ответ

0 голосов
/ 25 октября 2018

Это не поддерживается через интерфейс IDistributeCache.Он предназначен для получения / установки определенного ключа, а не для возврата диапазона ключей.Если вам нужно сделать что-то подобное, вам нужно перейти в основной магазин, то есть Redis.Хорошей новостью является то, что вам не нужно ничего дополнительного: та же самая библиотека StackExchange.Redis, которая необходима для поддержки реализации Redis IDistributedCache, также предоставляет клиент, который вы можете использовать напрямую.

В частности, для вашего сценарияздесь вам понадобится код вроде:

var server = _redis.GetServer(someServer);
foreach(var key in server.Keys(pattern: cacheKey)) {
    // do something
}

Здесь _redis - это экземпляр ConnectionMultiplexer.Это уже должно быть зарегистрировано в вашей коллекции сервисов, поскольку она используется реализацией Redis IDistributedCache.В результате вы можете вставить его в контроллер или другой класс, где существует этот код.

Переменная someServer является ссылкой на один из ваших серверов Redis.Вы можете получить все зарегистрированные серверы Redis через _redis.GetEndpoints().Это вернет IEnumerable серверов, которые вы можете выбрать или перечислить.Кроме того, вы можете просто подключиться напрямую к определенному серверу, передав строку хоста и порт:

var server = _redis.GetServer("localhost", 6379);

Однако имейте в виду, что Keys() приведет к выполнению команды SCAN или KEYS наРедис сервер.Используемое зависит от версии сервера, но и то, и другое довольно неэффективно, так как необходимо изучить все пространство ключей.Рекомендуется не использовать это в рабочей среде или, если необходимо, выпускать его на подчиненном сервере.

При техническом ответе на ваш вопрос, учитывая сложность и неэффективность SCAN / KEYS,вам бы лучше обслужили, просто сделав что-то вроде:

var cacheKeyPrefix = "application:customer:1234";
var profile = _distributedCache.GetString($"{cacheKeyPrefix}:Profile");
var orders = _distributedCache.GetString($"{cacheKeyPrefix}:Orders");
var invoices = _distributedCache.GetString($"{cacheKeyPrefix}:Invoices");
var payments = _distributedCache.GetString($"{cacheKeyPrefix}:Payments");

Это закончится гораздо быстрее и не потребует ничего особенного.

...