

新闻资讯
技术学院首选 StackExchange.Redis 客户端,需全局复用单例 ConnectionMultiplexer 实例连接 Redis;StringSet/StringGet 仅操作 RedisValue,存对象须手动序列化;Hash/List/Set 应按语义使用对应 API;常见异常多因连接管理不当。
用 C# 操作 Redis,首选 StackExchange.Redis —— 它是目前 .NET 生态中事实标准、免费、线程安全、支持连接池和集群的成熟客户端。
ConnectionMultiplexer 不是“每次操作都新建连接”,而是长生命周期的单例连接管理器。它自动复用 TCP 连接、重连失败节点、处理多数据库切换。错误做法是每次 new ConnectionMultiplexer.Connect(...),这会导致连接泄漏和性能暴跌。
ConnectionMultiplexer 实例(推荐 static readonly 或 DI 注册为 Singleton)
"localhost:6379"、"192.168.3.42:6500,password=123456,defaultDatabase=2"、"server1:6379,server2:6379,allowAdmin=true"
.Connect() 会阻塞直到连接就绪;建议加超时或用 .ConnectAsync() 避免启动卡死using StackExchange.Redis;public static class RedisHelper { private static readonly ConnectionMultiplexer _multiplexer = ConnectionMultiplexer.Connect("localhost:6379"); public static IDatabase Db => _multiplexer.GetDatabase(); }
IDatabase.StringSet() 和 IDatabase.StringGet() 只操作原始 RedisValue,不是自动 JSON 序列化的“万能存取”。传入 string 没问题,但传 DateTime、int 或对象会隐式转成字符串(如 DateTime.Now.ToString()),读出来仍是字符串,不会自动反序列化。
db.StringSet("user:1", JsonConvert.SerializeObject(user))
JsonConvert.DeserializeObject(db.StringGet("user:1"))
StringGet() —— 这个泛型方法只对基础类型(int、bool、DateTime)做简单解析,且失败时静默返回默认值,极易埋坑TimeSpan:例如 db.StringSet("token", "abc", TimeSpan.FromMinutes(30))
Redis 的数据结构操作不是“模拟 SQL”,而是按语义使用对应 API。比如用户信息用 Hash 存,就该用 HashSet/HashGetAll,而不是把整个对象塞进 StringSet。
db.HashSet("user:1001", new HashEntry[] { new("name", "Alice"), new("age", "28") })
db.ListLeftPush("queue:mail", "mail-123") + db.ListRightPop("queue:mail")
db.SetAdd("tags:post:42", "c#", "redis", "c#") → 实际只存两个元素cache:user:、lock:order:),避免冲突,也方便后期 KEYS cache:user:* 扫描清理绝大多数运行时报错都源于连接管理失当,而非语法错误。
NullReferenceException 在调用 db.StringSet 时发生?→ 极大概率是 _multiplexer 初始化失败(密码错、端口不通、防火墙拦截),但你没捕获 Connect 异常,导致返回 null
No connection is available to service this operation → 连接已断开且未自动重连(常见于网络抖动或 Redis 重启后),应监听 _multiplexer.ConnectionFailed 事件并记录日志redis-server.exe 启动时,默认不启用密码、绑定 127.0.0.1、端口 6379;生产环境务必配 requirepass 和 bind,否则 StackExchange.Redis 会因认证失败静默断连真正难的不是写对一行 StringSet,而是让连接稳如磐石、序列化不丢精度、key 设计能支撑未来删查改——这些细节在压测或上线后才暴露,但补救成本远高于初期想清楚。