首选 StackExchange.Redis 客户端,需全局复用单例 ConnectionMultiplexer 实例连接 Redis;StringSet/StringGet 仅操作 RedisValue,存对象须手动序列化;Hash/List/Set 应按语义使用对应 API;常见异常多因连接管理不当。

用 C# 操作 Redis,首选 StackExchange.Redis —— 它是目前 .NET 生态中事实标准、免费、线程安全、支持连接池和集群的成熟客户端。
怎么连上 Redis?ConnectionMultiplexer 是关键
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(); }
StringSet/StringGet 为什么有时返回空?注意类型和序列化
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))
Hash、List、Set 等结构怎么用?别直接拼 key 名
Redis 的数据结构操作不是“模拟 SQL”,而是按语义使用对应 API。比如用户信息用 Hash 存,就该用 HashSet/HashGetAll,而不是把整个对象塞进 StringSet。
- 哈希表(Hash)适合实体字段拆存:
db.HashSet("user:1001", new HashEntry[] { new("name", "Alice"), new("age", "28") }) - 列表(List)用于队列/栈:
db.ListLeftPush("queue:mail", "mail-123")+db.ListRightPop("queue:mail") - 集合(Set)去重:
db.SetAdd("tags:post:42", "c#", "redis", "c#")→ 实际只存两个元素 - 所有 key 命名建议带业务前缀(如
cache:user:、lock:order:),避免冲突,也方便后期KEYS cache:user:*扫描清理
常见报错和坑:NullReferenceException / “No connection is available”
绝大多数运行时报错都源于连接管理失当,而非语法错误。
-
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 设计能支撑未来删查改——这些细节在压测或上线后才暴露,但补救成本远高于初期想清楚。










