Bun 的 Redis 客户端支持 Redis 服务器版本 7.2 及以上。
redis.ts
入门
使用 Redis 客户端,首先需要创建一个连接:redis.ts
REDIS_URLVALKEY_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 中加入。基本用法
在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)
AUTHINFOQUITEXECMULTIWATCHSCRIPTSELECTCLUSTERDISCARDUNWATCHPIPELINESUBSCRIBEPSUBSCRIBEUNSUBSCRIBEUNPSUBSCRIBE
连接选项
创建客户端时,可以传入选项来配置连接:redis.ts
重连行为
连接断开时,客户端会自动尝试使用指数退避算法重连:- 客户端从较短的延迟(50ms)开始,每次尝试都会将延迟加倍
- 客户端将重连延迟上限设为 2000ms(2 秒)
- 客户端最多尝试重连
maxRetries次(默认值:20) - 断开连接期间,客户端会:
- 如果
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