在.NET Core依赖注入中,StackExchange.Redis.ConnectionMultiplexer`应该是`AddStatic`还是`AddScope`?

时间:2016-11-28 12:43:16

标签: redis .net-core stackexchange.redis

我正在使用StackExchange.Redis向.NET Core添加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进行依赖注入。

我的问题是:ConnectionMultiplexerdesigned to be reused,因此我使用AddSingleton为整个应用程序保留了一个实例。但是,我也可以使用AddScoped在请求期间使用一个。哪个更好?为什么?

1 个答案:

答案 0 :(得分:6)

应用程序的预期负载是多少?如果你有很多并发性,我认为使用AddScoped意味着为每个请求启动和关闭连接会带来很多不必要的负担。

同样这些观察结果恕我直言,你应该使用AddSingleton

  

(...)您想要使用a非常罕见   简单地说ConnectionMultiplexer,因为想法是重用这个对象。

     

redis的另一个常见用途是作为发布/订阅消息分发工具;   这也很简单,并且在连接失败的情况下   ConnectionMultiplexer将处理重新订阅的所有细节   请求的频道。

此外,您将节省只有一个ConnectionMultiplexer(恕我直言)实例的内存。