Я использую кэш Redis для Azure для разработки и хочу проверить, как я обрабатываю исключения. Согласно лучшим практикам, можно столкнуться с RedisConnectionExceptions, и чтобы решить эту проблему, мы должны избавиться от старого ConnectionMultiplexer и создать новый. Если для abortConnect задано значение false, мультиплексор будет молча повторять попытку подключения без выдачи ошибки. Таким образом, если возникнет исключение, оно произойдет только после нескольких попыток восстановления, но по-прежнему не удастся. Я правильно понимаю это? Это моя строка подключения -
cachename.redis.cache.windows.net:6380,password=Password,ssl=True,abortConnect=False
Я считаю, что исключение подключения произойдет только тогда, когда вы попытаетесь вызвать GetConnection () на мультиплексоре. Найдите мой код ниже -
static Lazy<ConnectionMultiplexer> multiplexer = CreateMultiplexer();
public static ConnectionMultiplexer GetConnection() => multiplexer.Value;
private static Lazy<ConnectionMultiplexer> CreateMultiplexer()
{
return new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(connectionString));
}
private static void CloseMultiplexer(Lazy<ConnectionMultiplexer> oldMultiplexer)
{
if (oldMultiplexer != null)
{
oldMultiplexer.Value.Close();
}
}
public static void Reconnect()
{
var oldMultiplexer = multiplexer;
CloseMultiplexer(multiplexer);
multiplexer = CreateMultiplexer();
}
И я потребляю это ниже в другом классе -
public class RedisCacheManager
{
private static IDatabase _cache;
private TimeSpan expiry = new TimeSpan(hours: 6, minutes: 0, seconds: 0);
public RedisCacheManager()
{
try
{
_cache = RedisCacheHelper.GetConnection().GetDatabase();
}
catch(RedisConnectionException)
{
RedisCacheHelper.Reconnect();
new RedisCacheManager();
}
}
public async Task<RedisValue[]> GetFromCacheAsync(List<string> keys)
{
var cacheValues = await _cache.StringGetAsync(keys.Select(k => (RedisKey)k).ToArray());
return cacheValues;
}
public async Task SaveInCacheAsync<TValue>(Dictionary<string, TValue> kvps)
{
var tasks = new List<Task>();
foreach(var kvp in kvps)
{
tasks.Add(_cache.StringSetAsync(kvp.Key, JsonConvert.SerializeObject(kvp), expiry));
}
await Task.WhenAll(tasks);
}
}
Я не уверен, что id, вызывающий конструктор в блоке catch, является хорошей практикой. И есть ли другие исключения, которые мне нужно будет обработать при вызове StringGetAsync и StringSetAsync?