stackexchange.redis 必须全局单例、显式设超时、用 connectasync 并检查 isconnected;redisvalue 判空用 !value.isnull;多 key 操作用 mget/stringset 批量;cluster 下禁用 select 和非零 db。

StackExchange.Redis 的连接和读写不是“能跑就行”的事——错配超时、乱建连接、误判 null,三者任一都会让缓存变成性能黑洞或故障源。
ConnectionMultiplexer 必须全局单例,且带超时参数
直接 ConnectionMultiplexer.Connect("localhost:6379") 是最常见也最危险的写法。它不设超时,DNS 解析失败或端口不通时会卡死线程 5 秒,ASP.NET Core 启动阶段可能因此 hang 住整个服务。
- 连接字符串必须显式加
connectTimeout=2000和syncTimeout=1000,例如:"127.0.0.1:6379,connectTimeout=2000,syncTimeout=1000,password=abc" - 别用
Connect(),改用ConnectAsync()并 await;之后检查IsConnected,而不是只看是否抛异常 - 整个应用生命周期只应有一个
ConnectionMultiplexer实例——注册为 ASP.NET Core 的Singleton,别塞进using或 Scoped 生命周期 - 加
abortConnect=false,避免启动时 Redis 不可达直接崩掉进程
IDatabase.StringGet 返回的是 RedisValue,不是 string
直接 (string)db.StringGet("key") 或 string.IsNullOrEmpty(...) 判断,会把 “key 不存在” 和 “key 存的是空字符串” 混为一谈,掩盖业务逻辑缺陷。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 正确判断 key 是否存在:用
if (!value.IsNull),不是if (value != null) - 要存
null值?StringSet("k", null)会静默返回false;必须传RedisValue.Null才能触发删除 - 想读取后转成 string?先确认
!value.IsNull,再用value.ToString()(它对非 null 值安全) - 序列化对象别手拼 JSON 字符串——用
HashGetAll()或封装好的JsonSerializer.Serialize<t>()</t>更稳,避免 UTF-8 字节长度歧义
批量读写必须用 MGET / Pipeline / Lua,别写 for 循环
连续调用 10 次 StringGet() 就是 10 次网络往返,RTT 累积远超一次 MGET。这不是优化,是基础正确性问题。
- 多 key 读取:用
db.StringGet(new RedisKey[] { "k1", "k2", "k3" }),底层走 Redis 的MGET命令 - 多 key 写入:用
db.StringSet(new KeyValuePair<rediskey redisvalue>[] { ... })</rediskey> - 条件逻辑(如“查 A,存在则删 B,再设 C”)必须用
db.ScriptEvaluate()+ Lua,否则竞态不可避免 - 别在循环里反复调用
GetDatabase()——它开销极小,但没必要;提前存个局部变量更清晰
Cluster 模式下禁用 SELECT,DB 编号失效
Redis Cluster 不支持 SELECT 命令,所有 GetDatabase(1) 这类带 db 编号的调用,在 Cluster 下会被忽略,实际仍操作默认 DB(通常是 0),但不会报错,极易埋下数据错乱隐患。
- 确认部署模式:如果是 Cluster,连接字符串里不要带
defaultDatabase=1,代码里也别传非 0 的 db 编号给GetDatabase() - Proxy 集群实例同样不支持多 DB,文档明确写了限制
- 单机或 Sentinel 模式才可安全使用
GetDatabase(2)等方式切换逻辑库 - 若业务强依赖多 DB,要么换部署模式,要么用 key 前缀模拟(如
"user:db1:user_123")
真正难的不是“怎么连上”,而是连上之后如何不让缓存反拖慢系统——超时控制、null 语义、批量边界、集群适配,这四点漏掉任意一个,线上就容易出不可复现的“偶发超时”或“数据丢失”。










