今天在掘金看到一个国人开发的 iosredis 被 redis 官方收购的旧闻,特地去查了一下这个库有多牛,然后分享给大家。有开发者评论甚至回复说,iosredis 收购金额达到了惊人的 400 万美金,不管数额真假,这个事情都足够振奋人心了!
直到 2022 年 8 月 30 日,历时整整 7 年,ioredis 已经成为 Node.js 最流行的 Redis 客户端。话不多说,直接进入正题!
1. 什么是 ioredisA robust, performance-focused, and full-featured Redis client for Node.js.
ioredis 是一款强大、功能齐全的 Redis 客户端,全球最大的在线商务公司阿里巴巴和许多其他出色的公司都在使用。支持 Redis >= 2.6.12,且与 Redis 7.x 完全兼容。
ioredis 具有以下突出特征:
功能齐全,支持 Cluster、Sentinel、Streams、Pipeline/Lua 脚本、Redis 函数、Pub/Sub、二进制消息等等高性能且 API 友好,支持与 Node 回调和 Native Promise 一起使用支持命令参数和回复的转换支持 Lua 脚本的抽象,允许开发者自定义命令支持二进制数据、支持 TLS 、支持离线队列和就绪检查支持 ES6 类型,例如 Map 和 Set支持 GEO 命令、Redis ACL支持复杂的错误处理策略、支持 NAT 映射ioredis 100% 用 TypeScript 编写并提供官方声明。目前 ioredis 在 Github 通过 MIT 协议开源,有超过 13.8k 的 star、1.3k 的 fork、280k 的项目依赖量、150 + 的代码贡献者,妥妥的前端优质项目。
2. 如何使用 ioredis连接 Redis当创建新的 Redis 实例时,将同时创建与 Redis 的连接。开发者可以通过以下方式指定要连接到哪个 Redis:
new Redis();// 连接到 127.0.0.1:6379new Redis(6380);// 127.0.0.1:6380new Redis(6379, "192.168.1.1");new Redis({ port: 6379, // Redis 端口 host: "127.0.0.1", // Redis host username: "default", // 需要 Redis >= 6 才支持 password: "my-top-secret", db: 0, // 默认值为 0});使用 TLS 加密时,开发者还可以将连接选项指定为 redis:// URL 或 rediss:// URL:
// 连接到 127.0.0.1:6380, db 4, 使用密码 "authpassword":new Redis("redis://:authpassword@127.0.0.1:6380/4");// 用户名也可通过 URI 传输new Redis("redis://username:authpassword@127.0.0.1:6380/4");支持流Redis v5 引入了一种称为流的新数据类型,既可以用作构建流架构的通信通道,也可以用作持久数据的类似日志的数据结构。
有了 ioredis,用法就非常简单了。 假设有一个生产者使用 redis.xadd("mystream", "*", "randomValue", Math.random()) 将消息发布到流,为了使用消息,可以有一个具有以下代码的消费者:
const Redis = require("ioredis");const redis = new Redis();const processMessage = (message) => { console.log("Id: %s. Data: %O", message[0], message[1]);};async function listenForMessage(lastId = "$") { // `results` 是一个数组,每个元素对应一个键。 // 因为这里只监听一个键(mystream),所以 `results` 只包含单个元素 const results = await redis.xread("block", 0, "STREAMS", "mystream", lastId); const [key, messages] = results[0]; // `key` equals to "mystream" messages.forEach(processMessage); // 将结果的最后一个 id 传递到下一轮 await listenForMessage(messages[messages.length - 1][0]);}listenForMessage();支持自动管道排队下面示例代码使用 ioredis 并启用了自动管道:
const db = new Redis({enableAutoPipelining: true});const server = http.createServer((request, response) => { const key = new URL(request.url, "https://localhost:3000/").searchParams.get( "key" ); db.get(key, (err, value) => { response.end(value); });});server.listen(3000);当 Node 收到请求时,它会安排这些请求在事件循环的一次或多次迭代中进行处理。
当然,ioredis 还支持 Pub/Sub、设置过期 key(Expiration)、处理二进制数据、Pipeline 管道、Lua 脚本、动态 Key、自动重连 (Auto-reconnect)、连接事件 (Connection Events)、离线队列 (Offline Queue) 等等。
更多关于 ioredis 的用法可以参考文末资料,本文不再过多展开。
参考资料https://github.com/redis/ioredis
https://github.com/redis/redis
https://juejin.cn/post/7345746216150876198