Обмен стеками.Мультиплексор соединений.Подключение и обмен стеками.ConnectionMultiplexer.GetServer при использовании нескольких подключений?

#c# #stackexchange.redis

Вопрос:

Если у вас несколько подключений в

 ConnectionMultiplexer.Connect(host1, host2, etc.)
 

и

 StackExchange.ConnectionMultiplexer.GetServer(...)
 

требуется ровно 1 конечная точка для подключения сервера — как это понять ? Как это имеет смысл?

Ответ №1:

Как бы вы ни подключались, за кулисами мультиплексор может знать о нескольких экземплярах сервера redis. Обычно топология сервера — это деталь реализации, которая не полезна или не нужна потребителю, поэтому она не нужна для API, доступных в разделе GetDatabase() ; библиотека будет беспокоиться о том, как направлять команды на серверы.

Однако иногда потребитель хочет использовать API, специфичный для отдельной конечной точки сервера; именно здесь GetServer() вступает в действие. Это может быть, например, для чтения (или изменения) отдельных конфигураций сервера (хотя существуют другие API-интерфейсы). В этом случае вам, очевидно, нужно сообщить библиотеке, с каким узлом вы хотите поговорить, поэтому этот параметр является обязательным GetServer() . Обратите внимание, что вы можете использовать GetEndPoints() API для отображения конечных точек в режиме воспроизведения (это не так обязательно то же самое, что и конечные точки, которые вы указали в Connect[Async] — например, кластер redis объявляет топологию с помощью команды redis, обычно дополнительных узлов).

Если вы не уверены , к какой конечной точке вы перейдете GetServer(...) , то есть большая вероятность, что вам не следует использовать GetServer(...) — под этим я подразумеваю: функциональность, которую вы ищете, вероятно, доступна GetDatabase(...) вместо этого, — что не требует указания конечной точки.

Или, может быть, проще:

  • GetDatabase(...) предоставляет доступ к логической базе данных, построенной в redis
  • GetServer(...) раскрывает базовую инфраструктуру серверов redis, предоставляющих эту базу данных

Комментарии:

1. Спасибо за объяснение. Я проверил свой код , и единственный раз, когда мне нужно GetServer(...) , это сделать запрос о ключах: IServer.Keys(...) другого способа ( GetDatabase(...) ) запросить ключи нет, верно?

2. @sabiland да; несмотря на то, что заманчиво думать, keys-это ориентированный на сервер API: stackexchange.github.io/StackExchange. Redis/KeysScan.html

3. Хорошо, спасибо, что прояснили это! Просто еще один быстрый вопрос, могу ли я подключить хост/порт sentinel GetServer(...) ?

4. @sabiland вы действительно разговариваете с экземпляром sentinel в качестве sentinel (а не в качестве шлюза к redis) в то время? если да… возможно, я не пробовал; если нет: нет

5. Сегодня мы устанавливаем Часовых на постановку. Перепробуем все варианты с GetServer(...)