Redis客户端
定义
一、说明
RedisClient 是基于 TCP 的 RESP 协议客户端,可连接到任何兼容 RESP 协议的 Redis 服务器(包括官方 Redis、Valkey、RedisService 等)。
二、创建客户端
🔄 正在加载代码...
2.1 认证连接
当服务器开启了密码认证时,需要在配置中指定密码。支持旧式 requirepass 和 Redis 6+ ACL 用户名认证两种方式。
🔄 正在加载代码...
三、字符串操作
3.1 读写字符串
🔄 正在加载代码...
3.2 批量操作
使用 MSetAsync / MGetAsync 可在一次网络往返中批量读写多个键值对。
🔄 正在加载代码...
3.3 自增与自减
对存储整数的键进行原子性自增/自减操作,常用于计数器、限流等场景。
🔄 正在加载代码...
四、键操作
🔄 正在加载代码...
方法说明:
ExistsAsync:检查键是否存在,返回存在的键数量ExpireAsync:设置键的过期时间(单位:秒),到期后键自动删除TtlAsync:获取键的剩余生存时间(单位:秒),-1表示永不过期,-2表示键不存在KeysAsync:使用 glob 模式匹配键名,支持*、?、[abc]等通配符DbSizeAsync:返回当前数据库中的键总数KeyDeleteAsync/DelAsync:删除单个或多个键FlushDbAsync:清空当前数据库中的所有键
五、列表操作
Redis 列表是一个有序的字符串序列,支持从头部或尾部插入和弹出元素,常用于消息队列、任务队列等场景。
🔄 正在加载代码...
方法说明:
ListLeftPushAsync:向列表头部插入一个或多个元素(对应LPUSH)ListRightPushAsync:向列表尾部追加一个或多个元素(对应RPUSH)ListLengthAsync:获取列表长度(对应LLEN)ListRangeAsync:获取列表指定范围内的元素,0到-1表示全部(对应LRANGE)
六、有序集合操作
有序集合(Sorted Set)中每个成员都关联一个分数(score),成员按分数从小到大排序,常用于排行榜、优先队列等场景。
🔄 正在加载代码...
方法说明:
SortedSetAddAsync:添加或更新有序集合成员及其分数(对应ZADD)SortedSetLengthAsync:获取有序集合中的成员数量(对应ZCARD)SortedSetRemoveAsync:删除有序集合中的指定成员(对应ZREM)
七、执行自定义命令
当内置扩展方法不满足需求时,可以使用 ExecuteAsync 方法直接发送任意 RESP 协议命令。
🔄 正在加载代码...
八、断线重连
网络不稳定时,可以通过重连插件配置自动重连策略。
🔄 正在加载代码...
参数说明:
UseSimple:使用固定间隔的简单重连策略- 第一个参数为重连时间间隔,第二个参数
maxRetryCount为最大重连次数,-1表示无限重连
九、性能基准
9.1 基准环境
对比对象为 Microsoft Garnet Redis 兼容客户端(官方高性能实现)。
每轮测试执行 1000 次命令,运行时为 .NET 10.0,使用本地 Redis 服务(redis-server.exe)。
9.2 测试结果
| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Allocated | Alloc Ratio |
|---|---|---|---|---|---|---|---|---|
| GarnetGetAsync | 20.87 ms | 0.417 ms | 0.348 ms | 0.85 | 0.02 | - | 390.8 KB | 1.02 |
| GarnetIncrAsync | 25.59 ms | 0.292 ms | 0.243 ms | 1.05 | 0.01 | 31.2500 | 523.59 KB | 1.37 |
| GarnetPingAsync | 24.55 ms | 0.135 ms | 0.126 ms | 1.00 | 0.01 | - | 390.8 KB | 1.02 |
| GarnetSetAsync | 25.55 ms | 0.207 ms | 0.193 ms | 1.05 | 0.01 | 31.2500 | 500.13 KB | 1.31 |
| TouchSocketGetAsync | 24.74 ms | 0.116 ms | 0.109 ms | 1.01 | 0.01 | - | 406.42 KB | 1.06 |
| TouchSocketIncrAsync | 24.63 ms | 0.148 ms | 0.139 ms | 1.01 | 0.01 | - | 351.73 KB | 0.92 |
| TouchSocketPingAsync | 24.43 ms | 0.262 ms | 0.219 ms | 1.00 | 0.01 | - | 382.98 KB | 1.00 |
| TouchSocketSetAsync | 24.92 ms | 0.113 ms | 0.106 ms | 1.02 | 0.01 | - | 382.98 KB | 1.00 |
Baseline 为
TouchSocketPingAsync,Ratio=1.00 表示与基准持平。
结论:
- 耗时:
TouchSocket.Redis与 Garnet 总体持平,各操作均在基准 ±5% 以内。 - 内存:
TouchSocketIncrAsync的Alloc Ratio为 0.92,分配量低于 Garnet 对应操作;SET/PING亦无额外 GC 压力。
9.3 降低热路径分配
在高频调用场景下,将 RedisValue.Command(...) 预构建为静态字段,可实现热路径零额外分配。
🔄 正在加载代码...