我正在尝试使用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毫秒的标志?
谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!