Я пытаюсь использовать библиотеку 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 мс?
Спасибо.