电话
400 9058 355
ConnectionMultiplexer 必须全局单例复用,严禁每次新建或Scoped注入;IDatabase可随时获取无需缓存;异步操作必须await,禁用.Result/.Wait();读多写少时可用CommandFlags.DemandSlave分流至从节点。
StackExchange.Redis 的核心是 ConnectionMultiplexer,它本身线程安全、内置连接池和自动重连,**必须全局复用一个实例**。多次 new ConnectionMultiplexer 会导致 socket 耗尽、TIME_WAIT 暴涨、CPU 升高,甚至 Redis 服务端拒绝新连接。
常见错误是把 ConnectionMultiplexer 塞进 using 或注入为 Scoped 服务——这等于每请求建一次连接,完全违背设计初衷。
Singleton:用 services.AddSingleton(sp => ConnectionMultiplexer.Connect(configuration))
abortConnect=false,避免启动失败直接崩掉进程;加 connectTimeout=5000 和 syncTimeout=5000 防止阻塞过久ConnectionFailed 和 InternalError 事件,但别在里面做重连逻辑(multiplexer 自己会重试),适合打日志或触发告警IDatabase 是轻量级句柄,不持有连接,每次调用 connecti 都是 O(1) 开销。没必要把它存成字段或缓存起来——反而容易在多库(如 db0/db1)场景下搞混上下文。
注意:如果用了 defaultDatabase 参数(比如 GetDatabase(1)),它只影响后续命令的默认 db 编号,不会改变底层 multiplexer 行为。
IDatabase 实例完全安全ITransaction)或管道(IBatch),才需要显式创建新上下文,且必须在同一线程内完成提交IDatabase 当闭包变量长期持有——没坏处,但无意义StackExchange.Redis 的所有 *Async 方法(如 StringGetAsync、HashSetAsync)底层基于 ValueTask,**同步等待(.Result / .Wait())极易引发死锁**,尤其在 ASP.NET Core 同步上下文受限环境里。
典型现象:接口偶尔卡住、线程池饥饿、请求堆积。这不是 Redis 慢,是线程被自己锁死了。
async Task,调用链全程 await
Task.Run(() => db.StringGetAsync(...)).Result —— 这只是把死锁换个地方发生db.StringGet(key) 同步版本,但它会阻塞线程,仅限低频、超短耗时场景默认情况下,所有命令都走主节点(即使你配了哨兵或集群)。遇到读多写少场景,可以利用 CommandFlags 把只读命令发到从节点,减轻主节点压力:
await db.StringGetAsync("key", CommandFlags.DemandSlave);
但这有前提:Redis 配置了 slave-read-only yes,且 multiplexer 连接字符串里启用了 allowAdmin=true(仅开发/测试环境建议开启,生产慎用)。
DemandSlave 不生效,路由由 key hash 决定,无法手动指定节点SyncTimeout 过小(导致频繁超时重试)或 AbortOnConnectFail=false 未设(启动失败静默)IServer.ClientList() 在 Redis CLI 查当前连接数,确认是否真由客户端连接爆炸引起,而非服务端配置限制ConnectionMultiplexer 的健康状态感知和故障转移延迟——它不会主动通知你“这个节点已永久失联”,得靠你结合 IsConnected、GetStatus() 和业务超时做兜底。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...