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() {
  /* ... */
});

 

posted @ 2024-03-20 16:13  李小菜丶  阅读(326)  评论(0)    收藏  举报