.NET Core StackExchange.Redis ConnectionMultiplexer настройка для нескольких серверов Redis - PullRequest
0 голосов
/ 19 февраля 2019

Я разрабатываю некоторые веб-интерфейсы в .NET Core 2.2

Требования привели нас к тому, что данные хранятся / кэшируются / централизуются в нескольких хранилищах Redis (для простоты, давайте предположим, что 2 сервера Redis).

Это будет (как пример)

  1. сервер 1 для защиты данных
  2. сервер 2 для некоторых других данных

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

части StartUp.ConfigureServices

  ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("server1:6729");
  services.AddSingleton<IConnectionMultiplexer>(cm);

  services.AddDataProtection()
    .SetApplicationName("myapp")
    .PersitKeysToStackExchangeRedis(cm, "DataProtection-Keys");

Ключи, как и ожидалось, хранятся в хранилище redis на сервере 1.


Теперь мне нужно интегрировать второе хранилище.

Может ли ConnectionMultiplexer использоваться для подключения к двум серверам?

ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("server1:6729;server2:6729"); //?

Как получить правильную базу данных, указывающую на правильный (1-й или 2-й) сервер?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Или просто иметь синглтон фабрики ConnectionMultiplexer:

public class ConnectionFactory
{
    private Lazy<ConnectionMultiplexer> _cnn1 { get; set; }
    private Lazy<ConnectionMultiplexer> _cnn2 { get; set;}
    public ConnectionFactory(string cnn1, string cnn2)
    {
        _cnn1 = new Lazy<UserQuery.ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(cnn1));
        _cnn2 = new Lazy<UserQuery.ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(cnn2));
    }
    public ConnectionMultiplexer GetConnection1()
    {
        return _cnn1.Value;
    }
    public ConnectionMultiplexer GetConnection2()
    {
        return _cnn2.Value;
    }
}

И зарегистрироваться как:

var factory = new ConnectionFactory("server1:6379", "server2:6379");
services.AddSingleton(factory);

var cm1 = factory.GetConnection1();
var cm2 = factory.GetConnection2();

....
0 голосов
/ 19 февраля 2019

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

Если вы просто хотите логически разделить ваши ключи, Redis имеет 8базы данных внутри.Вы владеете другим кодом хранения, например, можете просто позвонить _muxer.GetDatabase(3) и использовать тот же сервер.

Если у вас есть другая причина, по которой вам нужны отдельные серверы, я бы создал другой класс / интерфейс оболочки.Класс-обертка может создать ConnectionMultiplexer и внедриться в область действия Singleton.В конечном итоге у вас есть 2 экземпляра мультиплексора, но это не большая проблема, главное, чего следует избегать, это обновить их много, например, за вызов.

public Interface IOtherStorage
{
    void StoreItem(string key, string value);
}

public class OtherStorage : IOtherStorage
{
    private IConnectionMultiplexer _muxer;

    public OtherStorage(string connection)
    {
        _muxer = ConnectionMultiplexer.Connection(connection)
    }

    public void StoreItem(string key, string value)
    {
        _muxer.GetDatabase().StringSet(key, value);
    }
}

И при запуске

services.AddSingleton<IOtherStorage>(c => new OtherStorage("server2:6279");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...