Node.js的Redis客户端 - ioredis
ioredis 是一个受欢迎的 Node.js 客户端库,用于与 Redis 数据库进行交互。它提供了一种异步、基于事件的接口,支持各种 Redis 功能,如管道、事务、发布/订阅等。
Pipeline
在 ioredis 库中,Pipeline 是一种将多个命令合并成单个请求发送到 Redis 的方法,以减少往返时间。
使用 ioredis,您可以使用 "pipeline" 方法将多个命令排队,然后在单个操作中将它们发送到 Redis,通过将命令批处理在一起来提高整体性能,特别适用于需要按顺序在 Redis 上执行多个操作的情况。
用redis.pipeline()
创建一个Pipeline
实例。- 调用任何 Redis命令,命令在内存中排队
- 调用
exec
方法执行命令
var pipeline = redis.pipeline(); pipeline.set("foo", "bar"); pipeline.del("cc"); pipeline.exec(function(err, results) { });
或者链式调用
redis .pipeline() .set("foo", "bar") .del("cc") .exec(function(err, results) {});
`exec`还返回一个Promise:
var promise = redis .pipeline() .set("foo", "bar") .get("foo") .exec(); promise.then(function(result) { // result === [[null, 'OK'], [null, 'bar']] });
每个链接的命令还可以有一个回调,当命令收到回复时将调用该回调:
redis .pipeline() .set("foo", "bar") .get("foo", function(err, result) { // result === 'bar' }) .exec(function(err, result) { // result[1][1] === 'bar' });
除了pipeline
单独向队列添加命令之外,您还可以将命令和参数数组传递给构造函数:
redis.pipeline([["set", "foo", "bar"], ["get", "foo"]]).exec(function() { /* ... */ });
multi
大多数时候,事务命令multi
&exec
与管道一起使用。
当multi
调用时,默认情况下会自动创建一个Pipeline实例,因此可以像使用pipeline一样,使用multi
:
redis .multi() .set("foo", "bar") .get("foo") .exec(function(err, results) { // results === [[null, 'OK'], [null, 'bar']] });
如果事务的命令链中存在语法错误(例如参数数量错误、命令名称错误等),则不会执行任何命令,并返回错误:
redis .multi() .set("foo") .set("foo", "new value") .exec(function(err, results) { });
multi和pipeline的
不同之处在于,当为每个链接命令指定回调时,排队状态将传递给回调而不是命令的结果:
redis .multi() .set("foo", "bar", function(err, result) { // result === 'QUEUED' }) .exec(/* ... */);
如果你想使用没有管道的事务,请传递{ pipeline: false }
给multi
,每个命令将立即发送到 Redis,而无需等待调用exec
:
redis.multi({ pipeline: false }); redis.set("foo", "bar"); redis.get("foo"); redis.exec(function(err, result) { // result === [[null, 'OK'], [null, 'bar']] });
构造函数multi
还接受一批命令:
redis.multi([["set", "foo", "bar"], ["get", "foo"]]).exec(function() { /* ... */ });