c# 如何操作 redis

来源:这里教程网 时间:2026-02-21 17:35:42 作者:

用 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 设计能支撑未来删查改——这些细节在压测或上线后才暴露,但补救成本远高于初期想清楚。

相关推荐