Выполнить функцию в случае сбоя кеширования Redis

Я работаю над приложением .NET Core 3.1. Используется библиотека StackExchange.Redis для обработки операций с кешем в Redis.

Настройка строки подключения в Startup.cs

services.AddStackExchangeRedisCache(options => {
    options.Configuration = Configuration.GetValue<string>("localhost:6379");
    options.InstanceName = "laserlamb:"; 
});

Этот статический класс добавляет функцию SetRecord в IDistributedCache:

    public static class DistributedCache
    {
        public static bool isCacheAvailable = true;
        static DistributedCache()
        {

        }
        
        public static async Task SetRecord(this IDistributedCache cache, string recordId, string value)
        {
            try
            {
                if (this.isCacheAvailable)
                {
                    await cache.SetStringAsync(recordId, value);
                }
            }
            catch (Exception e)
            {
                Log.Error(e.Message);
            }
        }
    }

Использование объекта внедрения зависимости для установки записи в кэш.

public class SomeRandomClass
{
    private IDistributedCache cache;
    public SomeRandomClass(IDistributedCache cache) { this.cache = cache; }
    
    public async Task SaveToCache()
    {
        await cache.SetRecord("Key", "Value");
    }
}

Если мой экземпляр Redis не запущен, возникает ошибка.

Как мне обновить isCacheAvailable, если кеш недоступен?


person Vikas    schedule 29.03.2021    source источник
comment
Не уверен, о чем вы здесь спрашиваете. Можете ли вы показать пример того, что вы хотите, если кеш недоступен?   -  person stuartd    schedule 30.03.2021
comment
@stuartd Я обновил вопрос и код. Пожалуйста, дайте мне знать, если это поможет.   -  person Vikas    schedule 30.03.2021


Ответы (1)


Я думаю, вы хотите проверить проект Polly. В нем есть Retry/WaitAndRetry/RetryForever и Circuit Breakers, которые могут пригодиться.

У вас есть подключаемый модуль для Microsoft DistributedCache Provider.

Проверить это.

person Sasaman    schedule 29.03.2021
comment
Спасибо. Я знаю про Полли, но никогда не думал, что там это сработает. :) - person Vikas; 30.03.2021
comment
Конечно, это хорошо, это хорошо для ситуаций, когда вы хотите повторить попытку и вернуться к регистрации. - person Sasaman; 30.03.2021
comment
Если вы не понимаете, как решить с Полли - напишите мне. Но в основном вы можете использовать Retry (если хотите) вместе с резервной политикой для ведения журнала или вызова другого метода. Тогда вы можете объединить их в одну Политику. :) Но, отличная, простая, но мощная штука. - person Sasaman; 30.03.2021
comment
Сработало отлично. Я бился головой до трех часов ночи, пытаясь понять, как это решить. Ваше решение простое и достаточно эффективное. Большое спасибо @Sasaman ???????? - person Vikas; 30.03.2021
comment
Отлично, его можно использовать во многих ситуациях, держите его в рукаве. ^ _ ^ - person Sasaman; 30.03.2021
comment
Роджер, что .. ???? - person Vikas; 30.03.2021