Должен ли `StackExchange.Redis.ConnectionMultiplexer` быть `AddSingleton` или `AddScope` во внедрении зависимостей .NET Core?

Я добавляю соединение Redis с .NET Core, используя StackExchange.Redis, сейчас оно выглядит примерно так:

public static IServiceCollection AddRedisMultiplexer(
    this IServiceCollection services,
    Func<ConfigurationOptions> getOptions = null)
{
    // Get the options or assume localhost, as these will be set in Startup.ConfigureServices assume they won't change
    var options = getOptions?.Invoke() ?? ConfigurationOptions.Parse("localhost");

    // The Redis is a singleton, shared as much as possible.
    return services.AddSingleton<IConnectionMultiplexer>(provider => ConnectionMultiplexer.Connect(options));
}

Затем в Startup

public void ConfigureServices(IServiceCollection services)
{
    services.AddRedisMultiplexer(() => 
        ConfigurationOptions.Parse(Configuration["ConnectionStrings:Redis"]));
    ...

Это означает, что я могу использовать IConnectionMultiplexer для внедрения зависимостей где угодно.

Мой вопрос: ConnectionMultiplexer предназначен для повторного использования, поэтому я использовал AddSingleton, чтобы сохранить один экземпляр для всего приложения. Однако я также мог бы использовать AddScoped, чтобы использовать его на время запроса. Что лучше и почему?


person Keith    schedule 28.11.2016    source источник


Ответы (1)


Какая нагрузка ожидается на приложение? Если у вас много параллелизма, я думаю, что использование AddScoped будет означать много ненужного бремени для инициирования и закрытия соединений для каждого запроса.

Также эти наблюдения ИМХО показывают, что вы должны использовать AddSingleton

(...) исключительно редко вы захотите кратко использовать ConnectionMultiplexer, так как идея состоит в том, чтобы повторно использовать этот объект.

Еще одно распространенное использование Redis — инструмент распространения сообщений публикации/подписки; это также просто, и в случае сбоя соединения ConnectionMultiplexer обработает все детали повторной подписки на запрошенные каналы.

Кроме того, вы сэкономите память, имея только один экземпляр ConnectionMultiplexer (ИМХО).

person Niloct    schedule 28.11.2016
comment
Приложение должно масштабироваться, но я не ожидаю большого количества одновременных запросов. Мое мнение - использовать и AddSingleton, но я новичок в использовании StackExchange.Redis и немного не уверен, насколько повторно использовать мультиплексор. - person Keith; 28.11.2016
comment
@Keith Мультиплексор, кажется, даже обрабатывает несколько экземпляров Redis (главный / подчиненный), просто передавая URL-адреса подключения, поэтому я думаю, что это хороший выбор. - person Niloct; 28.11.2016