Это не поддерживается через интерфейс 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");
Это закончится гораздо быстрее и не потребует ничего особенного.