You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中StackExchange.Redis.Extensions.Core的Redis连接时机咨询

关于StackExchange.Redis.Extensions.Core中Redis连接建立时机的说明

结合你的配置和代码,Redis连接的建立时机可以拆分为以下几个阶段:

1. 服务注册阶段:仅完成配置与服务注入

当你执行services.AddStackExchangeRedisExtensions<NewtonsoftSerializer>(redisConfiguration)时,只是把Redis配置、序列化器以及IRedisClient等服务注册到.NET Core的DI容器中,不会建立任何实际的Redis网络连接。

2. 客户端实例化阶段:仅初始化客户端对象

当你的CacheService被DI容器创建(首次注入IRedisClient时),IRedisClient实例会被初始化,加载你配置的密码、超时时间、池大小等参数,但这一步依然没有发起网络连接请求。

3. 首次执行Redis命令阶段:真正建立连接

这是连接建立的核心时机:

  • 你的代码中Database属性是懒加载模式,第一次访问时会调用_redisClient.GetDefaultDatabase(),但这只是获取Redis数据库的抽象对象,还没触发连接;
  • 当你第一次调用await Database.AddAsync(...)执行具体的Redis命令时,StackExchange.Redis底层才会根据配置创建连接池(你的PoolSize=1,所以只会创建一个连接),发起实际的网络连接,完成SSL握手、身份认证等流程。

补充说明

  • 配置中的ConnectTimeout、ConnectRetry会在首次连接阶段生效:如果连接超时或者失败,会按照指定次数重试;
  • 连接建立后会被放入连接池复用,除非连接意外断开,否则不会频繁重建连接。

你的appsettings配置

"Redis": {
  "Password": "xyz123", 
  "AllowAdmin": true,
  "Ssl": true,
  "KeepAlive": 180,
  "ConnectTimeout": 5000, //Timeout for connecting to redis
  "ConnectRetry": 2,
  "PoolSize": 1,
  "User": "appuser",
  "SyncTimeout": 5000, 
  "AsyncTimeout": 5000, 
  "Database": 0,
  "Hosts": [
    {
      "Host": "cluster.payment-redis.hshwxw12.use1.cache.amazonaws.com",
      "Port": "6379"
    }
  ]
}

你的代码实现

var redisConfiguration = Configuration.GetSection("Redis").Get<RedisConfiguration>();
services.AddStackExchangeRedisExtensions<NewtonsoftSerializer>(redisConfiguration);   

private readonly IRedisClient _redisClient;
private readonly ILogger<ICacheService> _logger;
private IRedisDatabase _redisDatabase;
private bool IsDisposed = false;
public CacheService(IRedisClient redisClient, ILogger<ICacheService> _logger)
{
    this._redisClient = redisClient;
    this._logger = _logger;
}

private IRedisDatabase Database
{
    get
    {
        if (_redisDatabase == null)
        {
            _logger.LogInformation(_redisClient.ToString());
            _redisDatabase = _redisClient.GetDefaultDatabase();
        }
        return _redisDatabase;
    }
}
public async Task<(bool isSuccess, string errorMessage)> SetAsync<T>(string key, T data, TimeSpan? expiry)
{
    bool isSuccess = false;
    string errorMessage = string.Empty;
    if (expiry == null)
    {
        expiry = TimeSpan.FromHours(1);
    }
    try
    {
        string jsonData = JsonConvert.SerializeObject(data);

        await Database.AddAsync(key, jsonData, (TimeSpan)expiry).ConfigureAwait(false);
        isSuccess = true;

    }
    catch (Exception ex)
    {
        errorMessage = ex?.Message;
        _logger.LogError(ex?.Message);
    }
    return (isSuccess, errorMessage);
}

内容的提问来源于stack exchange,提问作者NET Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:50:26