我了解这CommandFlags.FireAndForget是针对您不关心响应的情况。
CommandFlags.FireAndForget
即使响应对于正在运行的应用程序并不重要,它也可以保证交付吗?
实际上,Redis协议并不真正支持“即发即弃”操作。除了发布/订阅流量外,所有Redis命令都与答复匹配,并且无法告诉Redis服务器忽略答复。
现在,某些客户端(例如StackExchange.Redis)通过协议的异步实现来模拟“解雇”模式。实际上,StackExchange.Redis中的“即发即弃”模式与“异步”模式非常相似,不同之处在于,在收到答复后,它们只会被丢弃。
它可靠吗?好吧,只要TCP / IP保证交付,它就保证交付。网络将尽力传输数据包(如果其中某些数据包丢失,最终将再次传输数据包),但这全部由TCP处理。
现在,如果服务器关闭或决定关闭连接,则客户端仅在尝试从套接字读取时才知道。StackExchange.Redis可能会愉快地继续在无效连接上发送命令一段时间。如果您有中间层(例如Twemproxy),情况可能会更糟。
换句话说,“即发即弃”流量通常会发送到服务器,并且网络上不会丢失任何消息,但是如果您遇到服务器或连接问题,则在客户端有机会注意到之前可能会丢失一些流量。它。我将此称为尽力而为行为。