/// <summary> /// Create REDIS client. /// </summary> /// <param name="logger">The logger.</param> /// <param name="name">The name.</param> /// <param name="intent">The intent.</param> /// <param name="configuration">The configuration.</param> /// <param name="endpointKey">The endpoint key.</param> /// <param name="passwordKey">The password key.</param> /// <returns></returns> /// <exception cref="RedisConnectionException">Fail to establish REDIS connection</exception> private async Task <ConnectionMultiplexer> CreateAsync( ILogger logger, string name, RedisUsageIntent intent, Action <ConfigurationOptions>?configuration, string endpointKey, string passwordKey) { string endpoint = Environment.GetEnvironmentVariable(endpointKey) ?? "localhost"; string?password = Environment.GetEnvironmentVariable(passwordKey); var sb = new StringBuilder(); var writer = new StringWriter(sb); var redisConfiguration = ConfigurationOptions.Parse(endpoint); redisConfiguration.ClientName = name; switch (intent) { case RedisUsageIntent.Admin: redisConfiguration.AllowAdmin = true; break; default: break; } configuration?.Invoke(redisConfiguration); redisConfiguration.Password = password; ConnectionMultiplexer redis; TimeSpan delay = RETRY_INTERVAL_DELAY; for (int i = 1; i <= RETRY_COUNT; i++) { try { redis = await ConnectionMultiplexer.ConnectAsync(redisConfiguration, writer); return(redis); } catch (Exception ex) { writer.Flush(); if (i >= RETRY_COUNT) { logger.LogError(ex.FormatLazy(), $"Fail to create REDIS client [final retry ({i})]. {Environment.NewLine}{sb}"); throw; } if (i % 10 == 0) { logger.LogWarning(ex.FormatLazy(), $"Fail to create REDIS client [retry = {i}]. {Environment.NewLine}{sb}"); } } } throw new RedisConnectionException(ConnectionFailureType.UnableToConnect, "Fail to establish REDIS connection"); }
/// <summary> /// Initializes a new instance of the <see cref="RedisClientFactory" /> class. /// </summary> /// <param name="logger">The logger.</param> /// <param name="name">Identification for the connection within REDIS.</param> /// <param name="intent">The usage intent.</param> /// <param name="configuration">The configuration.</param> /// <param name="endpointKey">The environment key of endpoint.</param> /// <param name="passwordKey">The environment key of password.</param> public RedisClientFactory( ILogger logger, string name, RedisUsageIntent intent, Action <ConfigurationOptions>?configuration, string endpointKey, string passwordKey) { _multiplexerTask = CreateAsync( logger, name, intent, configuration, endpointKey, passwordKey); }