我正在使用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
进行依赖注入。
我的问题是:ConnectionMultiplexer
是designed to be reused,因此我使用AddSingleton
为整个应用程序保留了一个实例。但是,我也可以使用AddScoped
在请求期间使用一个。哪个更好?为什么?
答案 0 :(得分:6)
应用程序的预期负载是多少?如果你有很多并发性,我认为使用AddScoped
意味着为每个请求启动和关闭连接会带来很多不必要的负担。
同样这些观察结果恕我直言,你应该使用AddSingleton
(...)您想要使用a非常罕见 简单地说ConnectionMultiplexer,因为想法是重用这个对象。
redis的另一个常见用途是作为发布/订阅消息分发工具; 这也很简单,并且在连接失败的情况下 ConnectionMultiplexer将处理重新订阅的所有细节 请求的频道。
此外,您将节省只有一个ConnectionMultiplexer
(恕我直言)实例的内存。