所以根据 StackExchange.Redis 文档,我要重新使用IConnectionMultiplexer。
services.AddSingleton<IConnectionMultiplexer>(
ConnectionMultiplexer
.Connect($"{configsOptions.RedisUrl},password={secretsOptions.RedisPassword}"));
Run Code Online (Sandbox Code Playgroud)
但后来我发现在我的 redis 服务方法中,我必须注入 IConnectionMultiplexer 然后连接到数据库,如下所示:
public Task GetSomethingFromRedis(string key)
{
IDatabase db = connectionMultiplexer.GetDatabase();
string value = db.StringGet(key);
}
Run Code Online (Sandbox Code Playgroud)
不用connectionMultiplexer.GetDatabase()每次都调用,我可以像这样注入对象的单例吗?IDatabase或者这真的是一个坏主意吗?
services.AddSingleton<IDatabase>(cfg =>
{
var redisConnection =
ConnectionMultiplexer
.Connect($"{configsOptions.RedisUrl},password={secretsOptions.RedisPassword}");
return redisConnection.GetDatabase();
});
Run Code Online (Sandbox Code Playgroud) 这个想法是使用更少的连接和更好的性能.连接是否随时到期?
而对于另一个问题,是否_redis.GetDatabase()打开新连接?
private static ConnectionMultiplexer _redis;
private static IDatabase _db;
public RedisCacheProvider(string configuration)
{
if (_redis == null)
lock (myLock)
if (_redis == null)
{
_redis = ConnectionMultiplexer.Connect(configuration);
_db = _redis.GetDatabase();
}
}
public async Task<string> GetString(string key)
{
string result = null;
RedisValue val = await _db.StringGetAsync(key);
if (val.HasValue)
result = val;
return result;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用StackExchange.Redis它添加一个Redis连接到.NET Core ,它目前看起来像这样:
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));
}
Run Code Online (Sandbox Code Playgroud)
然后进去 Startup
public void ConfigureServices(IServiceCollection services)
{
services.AddRedisMultiplexer(() =>
ConfigurationOptions.Parse(Configuration["ConnectionStrings:Redis"]));
...
Run Code Online (Sandbox Code Playgroud)
这意味着我可以IConnectionMultiplexer在任何地方使用依赖注入.
我的问题是:ConnectionMultiplexer是可以重复使用,所以我用AddSingleton,以保持一个实例整个应用程序.但是我也可以AddScoped在请求期间使用一个.哪个更好?为什么?