StackExchange.Redis и FireAndForget для асинхронной / syn c операции - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь использовать библиотеку StackExchange.Redis для реализации кэширования. Одна вещь, которую я не понимаю, это как правильно использовать подход FireAndForget. Основываясь на документации, я вижу, что мне нужно предоставить CommandFlags.FireAndForget на случай, если я не хочу ждать, пока операция завершится.

Я написал тестовое консольное приложение (net 4.7.2, версия StackExchange.Redis - 2.0.601), у меня есть 4 метода, которые эмулируют добавление материала в кеш одним ключом:

//Async method with FireAndForget flag:  

public static async Task<bool> AddAsyncWithFF(string key, object entity)
        {
                if (DataBase != null)
                {
                    var redisValue = RedisValueHelper.GetRedisValue(entity);

                    if (redisValue != default(RedisValue))
                    {
                        return await DataBase.StringSetAsync(
                            key,
                            redisValue,
                            expiration.DateTime.Subtract(DateTime.Now),
                            flags: CommandFlags.FireAndForget);
                    }
                }

            return false;
        }

 //Async method without flag
 return await DataBase.StringSetAsync(
            key,
            redisValue,
            expiration.DateTime.Subtract(DateTime.Now),
            flags: CommandFlags.None);

 //Sync method with FireAndForget flag
 DataBase.StringSetAsync(
                key,
                redisValue,
                expiration.DateTime.Subtract(DateTime.Now),
                flags: CommandFlags.FireAndForget);

 //Sync method without flag
 DataBase.StringSetAsync(
            key,
            redisValue,
            expiration.DateTime.Subtract(DateTime.Now),
            flags: CommandFlags.None);

Я создаю 18 МБ случайных данных и сохраняю для каждого ключа в целях тестирования, вот результат (время, измеренное с использованием класса StopWatch):

  • Положить данные syn c. Прошло 229 мс
  • Положите syn c с данными FireAndForget. Прошло 234 мс
  • Поставить асин c данные. Прошло 12928 мс
  • Поместить asyn c с данными FireAndForget. Прошло 4508 мс

Что я не понимаю:

  • Почему синхронизация вызовов c с флагом FF и без занимает одно и то же время? Похоже, этот флаг не действует для вызовов syn c.
  • Почему метод asyn c с флагом FF занимает больше времени, чем метод syn c?
  • Что более интересно, тот факт, что версия asyn c FF занимает в 2-3 раза меньше выполнить asyn c без флага FF ...

В конечном счете, я бы хотел понять, почему я не могу иметь асинхронный вызов с флагом Fire and Forget, который занимает 200 мс?

Спасибо.

...