using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using StackExchange.Redis; using System.Linq; using WIDESEAWCS_RedisService.Options; namespace WIDESEAWCS_RedisService.Connection { public class RedisConnectionManager : IRedisConnectionManager { private readonly RedisOptions _options; private readonly ILogger _logger; private readonly Lazy _connection; private bool _disposed; public bool IsConnected { get { try { // 强制访问Value来触发连接创建 var connected = _connection.Value.IsConnected; _logger.LogDebug("IsConnected检查: IsValueCreated={IsValueCreated}, IsConnected={Connected}", _connection.IsValueCreated, connected); return connected; } catch (Exception ex) { _logger.LogWarning(ex, "IsConnected检查失败"); return false; } } } public RedisConnectionManager(IOptions options, ILogger logger) { _options = options.Value; _logger = logger; _logger.LogInformation("RedisConnectionManager构造开始, ConnectionString={ConnectionString}, Enabled={Enabled}", _options.ConnectionString, _options.Enabled); _connection = new Lazy(CreateConnection); _logger.LogInformation("RedisConnectionManager构造完成, Lazy已创建"); } private ConnectionMultiplexer CreateConnection() { try { _logger.LogInformation("开始创建Redis连接, ConnectionString={ConnectionString}", _options.ConnectionString); var configOptions = ConfigurationOptions.Parse(_options.ConnectionString); configOptions.AbortOnConnectFail = false; configOptions.ConnectRetry = _options.ConnectRetry; configOptions.DefaultDatabase = _options.DefaultDatabase; _logger.LogInformation("ConfigurationOptions解析完成, EndPoints={EndPoints}", string.Join(",", configOptions.EndPoints.Select(e => e.ToString()))); if (_options.EnableSentinel && _options.SentinelEndpoints.Count > 0) { configOptions.ServiceName = _options.SentinelMasterName; foreach (var endpoint in _options.SentinelEndpoints) { configOptions.EndPoints.Add(endpoint); } } var connection = ConnectionMultiplexer.Connect(configOptions); connection.ConnectionFailed += (_, e) => _logger.LogError("Redis连接失败: {FailureType}", e.FailureType); connection.ConnectionRestored += (_, e) => _logger.LogInformation("Redis连接恢复: {EndPoint}", e.EndPoint); _logger.LogInformation("Redis连接成功: {EndPoints}", string.Join(",", configOptions.EndPoints)); return connection; } catch (Exception ex) { _logger.LogError(ex, "Redis连接创建失败"); throw; } } public IDatabase GetDatabase(int db = -1) { return _connection.Value.GetDatabase(db == -1 ? _options.DefaultDatabase : db); } public IServer GetServer() { var endpoints = _connection.Value.GetEndPoints(); return _connection.Value.GetServer(endpoints[0]); } public ISubscriber GetSubscriber() { return _connection.Value.GetSubscriber(); } public ConnectionMultiplexer GetConnection() { return _connection.Value; } public void Dispose() { if (_disposed) return; _disposed = true; if (_connection.IsValueCreated) _connection.Value.Dispose(); } } }