相关疑难解决方法(0)

IDatabase 的 StackExchange.Redis 依赖注入?

所以根据 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)

c# stackexchange.redis .net-5

8
推荐指数
1
解决办法
6370
查看次数

使用StackExchange.Redis的正确方法

这个想法是使用更少的连接和更好的性能.连接是否随时到期?

而对于另一个问题,是否_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)

c# redis stackexchange.redis

7
推荐指数
1
解决办法
9876
查看次数

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

我正在使用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在请求期间使用一个.哪个更好?为什么?

redis stackexchange.redis .net-core

6
推荐指数
1
解决办法
1504
查看次数

标签 统计

stackexchange.redis ×3

c# ×2

redis ×2

.net-5 ×1

.net-core ×1