Skip to main content
Bun 的 Redis 客户端支持 Redis 服务器版本 7.2 及以上。
Bun 原生 Redis 客户端提供基于 Promise 的 API,内置连接管理、完全类型化的响应以及 TLS 支持。
redis.ts

入门

使用 Redis 客户端,首先需要创建一个连接:
redis.ts
默认情况下,客户端按优先级从以下环境变量读取连接信息:
  • REDIS_URL
  • VALKEY_URL
  • 若未设置,默认使用 "redis://localhost:6379"

连接生命周期

Redis 客户端会自动在后台管理连接:
redis.ts
你也可以手动控制连接生命周期:
redis.ts

基本操作

字符串操作

redis.ts

数值操作

redis.ts

哈希操作

redis.ts

集合操作

redis.ts

发布/订阅(Pub/Sub)

Bun 为 Redis Pub/Sub 协议提供了原生绑定,该功能在 Bun 1.2.23 中加入。
Redis Pub/Sub 目前处于实验阶段。我们预计它会趋于稳定,但仍在持续收集反馈并寻找改进方向。

基本用法

在 publisher.ts 中创建发布者:
publisher.ts
在另一个文件 subscriber.ts 中创建订阅者:
subscriber.ts
在一个终端运行订阅者:
terminal
另一个终端运行发布者:
terminal
订阅会占用 RedisClient 连接:具有订阅的客户端只能调用订阅方法(subscribe()、psubscribe()、unsubscribe()、punsubscribe())、pubsub() 和 ping()。要向 Redis 发送其他命令,请使用 .duplicate() 创建单独的连接:
redis.ts

发布消息

使用 publish() 方法发布消息:
redis.ts

订阅频道

使用 .subscribe() 方法订阅频道:
redis.ts
使用 .unsubscribe() 取消订阅:
redis.ts

高级用法

命令执行与流水线

客户端默认自动进行流水线处理,通过批量发送多个命令并在响应到达时依序处理,提升性能:
redis.ts
要禁用自动流水线处理,请将 enableAutoPipelining 选项设置为 false:
redis.ts

原生命令执行

使用 send 方法运行任意 Redis 命令,包括没有专用方法的命令。第一个参数是命令名称,第二个参数是字符串参数数组。
redis.ts

连接事件

可以注册连接事件处理函数:
redis.ts

连接状态及监控

redis.ts

类型转换

客户端会自动将 Redis 响应转换为 JavaScript 值:
  • Integer 响应会作为 JavaScript 数字返回
  • Bulk 字符串会作为 JavaScript 字符串返回
  • Simple 字符串会作为 JavaScript 字符串返回
  • Null Bulk 字符串和 Null 数组会作为 null 返回
  • 数组响应会作为 JavaScript 数组返回
  • Big number 响应(RESP3)会作为 BigInt 返回。非整数文本的负载会作为字符串返回。getBuffer 会将负载作为 Buffer 返回
  • 错误响应会抛出带有相应错误代码的 JavaScript 错误
  • 布尔响应(RESP3)会作为 JavaScript 布尔值返回
  • Map 响应(RESP3)会作为 JavaScript 对象返回
  • Set 响应(RESP3)会作为 JavaScript 数组返回
特殊命令特别处理:
  • EXISTS 返回布尔值(1 转 true,0 转 false)
  • SISMEMBER 返回布尔值(1 转 true,0 转 false)
以下命令会禁用自动流水线:
  • AUTH
  • INFO
  • QUIT
  • EXEC
  • MULTI
  • WATCH
  • SCRIPT
  • SELECT
  • CLUSTER
  • DISCARD
  • UNWATCH
  • PIPELINE
  • SUBSCRIBE
  • PSUBSCRIBE
  • UNSUBSCRIBE
  • UNPSUBSCRIBE

连接选项

创建客户端时,可以传入选项来配置连接:
redis.ts

重连行为

连接断开时,客户端会自动尝试使用指数退避算法重连:
  1. 客户端从较短的延迟(50ms)开始,每次尝试都会将延迟加倍
  2. 客户端将重连延迟上限设为 2000ms(2 秒)
  3. 客户端最多尝试重连 maxRetries 次(默认值:20)
  4. 断开连接期间,客户端会:
    • 如果 enableOfflineQueue 为 true(默认值),则将命令加入队列
    • 如果 enableOfflineQueue 为 false,则立即拒绝命令

支持的 URL 格式

Redis 客户端支持多种连接 URL 格式:
redis.ts

错误处理

Redis 客户端会抛出带类型的错误,用于不同场景的异常:
redis.ts
常见错误码:
  • ERR_REDIS_CONNECTION_CLOSED - 与服务器的连接已关闭
  • ERR_REDIS_AUTHENTICATION_FAILED - 无法通过服务器的身份验证
  • ERR_REDIS_INVALID_RESPONSE - 收到来自服务器的无效响应
  • ERR_REDIS_SERVER_ERROR - 服务器发送了错误回复,可能是拒绝某条命令,或者在订阅者模式下关闭连接

示例用例

缓存

redis.ts

限流

redis.ts

会话存储

redis.ts

实现说明

Bun 的 Redis 客户端使用 Rust 实现,并使用 Redis 序列化协议(RESP3)。它会使用指数退避算法自动重连。它还会对命令进行流水线处理,因此可以在不等待先前命令响应的情况下发送多个命令。

限制及未来规划

我们计划在未来版本中解决的限制:
  • 事务(MULTI/EXEC)需要使用原始命令
不支持的功能:
  • Redis Sentinel
  • Redis Cluster