StackExchange.Redis中Async与FireAndForget混用致部分StringSet失败
Redis异步操作与FireAndForget标记混用的问题解答
核心结论
混用Async异步方法和CommandFlags.FireAndForget标记完全不合理,这正是你出现部分操作失效的根本原因。
问题原因
FireAndForget的设计初衷是让客户端发送命令后立刻返回,不等待Redis的响应,也不追踪命令是否执行成功。但你用await去等待这个异步方法,会导致客户端内部逻辑冲突:一方面要放弃响应追踪,另一方面又在等待一个不存在的有效响应,最终造成请求队列或连接池异常,部分请求被丢弃。- 即便不混用
await,使用FireAndForget本身就意味着客户端不会确认Redis是否接收并执行了命令。如果遇到网络波动、Redis负载过高或客户端连接异常,未被确认的请求会直接丢失,这就是5次操作仅3次生效的直接原因。
正确的两种用法
- 需要确保操作可靠:去掉
FireAndForget标记,正常使用异步等待:
return await _redisDBClient.StringSetAsync(key, value);
这种方式下客户端会等待Redis的执行响应,能确保命令生效,出现错误时也会抛出异常供你处理。
- 确实不需要等待结果(对可靠性要求低):保留
FireAndForget,但不要用await:
_ = _redisDBClient.StringSetAsync(key, value, flags: CommandFlags.FireAndForget);
但要注意,这种方式无法知晓命令是否执行成功,也捕获不到任何异常,仅适合日志上报这类非关键场景。
内容的提问来源于stack exchange,提问作者Poothabalan
相关产品推荐
相关产品推荐

