在StackExchange.Redis事务中使用FireAndForget标志是否有实际作用?
StackExchange.Redis事务中FireAndForget标志的作用说明
核心问题解答
- 在StackExchange.Redis的事务中使用
CommandFlags.FireAndForget标志不会发挥作用,调用transaction.ExecuteAsync()时会等待事务内所有命令(包括加了该标志的KeyExpireAsync)执行完毕才返回。
原因分析
Redis事务是原子性操作,所有事务内的命令会被打包成队列,通过MULTI/EXEC指令提交给服务器。服务器会一次性执行队列里的所有命令,然后返回全部命令的执行结果。StackExchange.Redis的事务实现完全依赖Redis的这一机制,因此不管事务内的单个命令是否添加FireAndForget标志,客户端都必须等待整个事务执行完成,才能收到服务器的响应。这就导致FireAndForget在事务场景下被忽略,无法实现“发后即忘”的效果。
补充问题解答
FireAndForget是StackExchange.Redis客户端独有的实现,不会传递给Redis服务器。Redis本身并没有提供让服务器提前返回响应的命令参数,这个标志的作用是让客户端在发送非事务命令后,不等待服务器的执行结果直接继续后续逻辑,相当于主动放弃获取该命令的执行状态。但在事务场景中,由于事务的原子性要求,客户端必须等待整个事务的执行结果,所以这个标志的特性无法生效。
示例代码
var transaction = Database.CreateTransaction(); transaction.StringSetAsync(key, value); transaction.KeyExpireAsync(key, timeToLive, CommandFlags.FireAndForget); await transaction.ExecuteAsync(); // 此处会等待所有事务命令(包括KeyExpire)执行完毕才返回
内容的提问来源于stack exchange,提问作者Simon Hardman
相关产品推荐
相关产品推荐

