用 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;
<p>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<user>(db.StringGet("user:1"))</user>
不要依赖 StringGet<t>()</t>—— 这个泛型方法只对基础类型(
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 设计能支撑未来删查改——这些细节在压测或上线后才暴露,但补救成本远高于初期想清楚。
