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

发布/订阅

Bun 为 Redis 发布/订阅协议提供了原生绑定,于 Bun 1.2.23 中添加。
Redis 发布/订阅是实验性功能。我们预计它会稳定,但仍欢迎反馈和改进建议。

基本用法

publisher.ts 中创建发布者:
publisher.ts
在另一个文件 subscriber.ts 中创建订阅者:
subscriber.ts
在一个终端中运行订阅者:
terminal
在另一个终端中运行发布者:
terminal
订阅会接管 RedisClient 连接:有订阅的客户端只能调用 RedisClient.prototype.subscribe()。要发送其他 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 值:
  • 整数响应作为 JavaScript 数字返回
  • 批量字符串作为 JavaScript 字符串返回
  • 简单字符串作为 JavaScript 字符串返回
  • 空批量字符串作为 null 返回
  • 数组响应作为 JavaScript 数组返回
  • 错误响应抛出带有相应错误码的 JavaScript 错误
  • 布尔响应(RESP3)作为 JavaScript 布尔值返回
  • 映射响应(RESP3)作为 JavaScript 对象返回
  • 集合响应(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 - 收到来自服务器的无效响应

用例示例

缓存

redis.ts

限流

redis.ts

会话存储

redis.ts

实现说明

Bun 的 Redis 客户端用 Rust 实现,使用 Redis 序列化协议(RESP3)。它会自动以指数退避重连,并将命令进行管道化,因此多个命令可以连续发送而无需等待前一个命令的回复。

局限性与未来计划

我们计划在未来版本中解决的局限性:
  • 事务(MULTI/EXEC)需要通过原始命令实现
不支持的功能:
  • Redis Sentinel
  • Redis 集群