.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
相关产品推荐
相关产品推荐

