跳到主要内容
版本:4.3

Redis客户端

定义

命名空间:
TouchSocket.Redis
安装:
dotnet add package TouchSocket.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 测试结果

MethodMeanErrorStdDevRatioRatioSDGen0AllocatedAlloc Ratio
GarnetGetAsync20.87 ms0.417 ms0.348 ms0.850.02-390.8 KB1.02
GarnetIncrAsync25.59 ms0.292 ms0.243 ms1.050.0131.2500523.59 KB1.37
GarnetPingAsync24.55 ms0.135 ms0.126 ms1.000.01-390.8 KB1.02
GarnetSetAsync25.55 ms0.207 ms0.193 ms1.050.0131.2500500.13 KB1.31
TouchSocketGetAsync24.74 ms0.116 ms0.109 ms1.010.01-406.42 KB1.06
TouchSocketIncrAsync24.63 ms0.148 ms0.139 ms1.010.01-351.73 KB0.92
TouchSocketPingAsync24.43 ms0.262 ms0.219 ms1.000.01-382.98 KB1.00
TouchSocketSetAsync24.92 ms0.113 ms0.106 ms1.020.01-382.98 KB1.00

Baseline 为 TouchSocketPingAsync,Ratio=1.00 表示与基准持平。

结论:

  • 耗时TouchSocket.Redis 与 Garnet 总体持平,各操作均在基准 ±5% 以内。
  • 内存TouchSocketIncrAsyncAlloc Ratio0.92,分配量低于 Garnet 对应操作;SET/PING 亦无额外 GC 压力。

9.3 降低热路径分配

在高频调用场景下,将 RedisValue.Command(...) 预构建为静态字段,可实现热路径零额外分配。

🔄 正在加载代码...