StackExchange.Redis和FireAndForget用于异步/同步操作

时间:2020-03-04 17:57:28

标签: c# .net redis async-await

我正在尝试使用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 mb的随机数据并为测试目的每个密钥保存一次,这是结果(使用StopWatch类测量的时间):

  • 放入同步数据。过去了229毫秒
  • 与FireAndForget数据同步。经过了234毫秒
  • 放入异步数据。过去了12928 ms
  • 将FireAndForget数据置于异步状态。过去了4508毫秒

我不明白的地方:

  • 为什么同步呼叫带有FF标志但没有花费相同的时间?似乎此标志对于同步调用无效。
  • 为什么带有FF标志的异步方法比同步方法需要更长的时间?
  • 更有趣的是,与没有FF标志的异步相比,异步FF版本执行时间少2-3倍...

最终我想了解为什么我不能使用耗时200ms的Fire and Forget标志进行异步调用?

谢谢。

0 个答案:

没有答案