stackexchange.redis和fireandforget用于异步/同步操作

ax6ht2ek  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(308)

我正在尝试使用stackexchange.redis库来实现缓存。有一件事我不明白,那就是如何正确地使用fireandforget方法。根据文档,我看到我必须提供commandflags.fireandfolget,以防我不想等到操作完成。
我编写了测试控制台应用程序(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);

我创建了18MB的随机数据,并为测试目的保存了每个键,结果如下(使用stopwatch类测量的时间):
放置同步数据。经过229毫秒
与fireandforget数据同步。经过234毫秒
放置异步数据。经过12928毫秒
与fireandforget数据异步。经过4508毫秒
我不明白的是:
为什么使用ff标志和不使用ff标志同步通话会占用相同的时间?似乎此标志对同步调用无效。
为什么带有ff标志的异步方法比同步方法花费的时间更长?
更有趣的是,异步ff版本的执行时间比没有ff标志的异步要少2-3倍。。。
最后,我想理解为什么我不能用fire异步调用并忘记需要200毫秒的标志?
谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题