首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis客户端(“就绪”)事件

Redis客户端(“就绪”)事件
EN

Stack Overflow用户
提问于 2015-07-10 19:42:44
回答 2查看 9K关注 0票数 3

我正在为Node.js使用Redis库-我可以监听连接‘就绪’事件,如下所示

代码语言:javascript
复制
var client = require('redis').createClient();

client.on('ready', function () {
    client.keys('*', function (err, keys) {
        if (err) {
            log.error(err);
        } else {
            for (var i = 0; i < keys.length; i++) {
                createLocalDataMap(keys[i]);
            }
        }
    });
});

但是,我怎样才能查询Redis,看看它是否已经准备好了,而不是在准备好处理之前侦听可能会触发的事件呢?

我想我可以放弃就绪事件,只执行一个查询,然后等待响应,但是有更好、更安全和更复杂的方法吗?

换句话说,我很可能不得不写一个这样的函数:

代码语言:javascript
复制
var isReady = false;

client.on('ready', function(){

      isReady = true;
});

function doSomethingMuchLater(){

if(isReady){

     //query redis as normal
}
else {

   client.on('ready', function(){
   isReady = true;
     //now I do what I wanted to do
   });

}
}

这看起来一点也不对,一定有更好的办法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-14 03:17:31

节点-redis客户端会在连接准备好之前自动排队发送任何命令。一旦连接,这些命令都会在.on(“准备好”)触发之前发送。因此,您实际上不需要使用.on(“就绪”)。如果您发送的命令太早,它们仍将按预期进行,如果连接完全失败,它们将永远不会被发送。

票数 5
EN

Stack Overflow用户

发布于 2021-12-10 00:56:11

即使命令是排队的,我还是遇到了一些令人讨厌的日志记录错误,因为我在DB未完全加载时发送命令。connect事件是不够的。

从医生那里:

options.enableReadyCheck布尔 当建立到Redis服务器的连接时,服务器可能仍在从磁盘加载数据库。加载时,服务器不响应任何命令。为此,当此选项为真时,ioredis将检查Redis服务器的状态,当Redis服务器能够处理命令时,将发出一个就绪事件。

因此,只有使用ioredis库才能使它可靠地工作:

代码语言:javascript
复制
import Redis from 'ioredis';

class RedisClient {
  private static instance: Redis.Redis | undefined;
  private redisUrl: string;
  private options?: Redis.RedisOptions;

  private constructor(
    redisUrl?: string,
    options?: Redis.RedisOptions,
  ) {
    this.redisUrl = redisUrl || `redis://${REDIS.HOST}:${REDIS.PORT}`;
    this.options = options;
  }

  static async init(
    redisUrl?: string,
    options?: Redis.RedisOptions,
  ): Promise<RedisClient | undefined> {
    try {
      RedisClient.instance = new Redis(RedisClient.redisUrl, {
        ...options,
        enableReadyCheck: true,
      });
      const onReady = (): Promise<boolean> => new Promise((resolve) => {
        (RedisClient.instance as Redis.Redis).on('ready', () => {
          resolve(true);
          infoLogger.info('Redis server online...');
        });
      });
      await onReady();
      return new RedisClient(redisUrl, {
        ...options,
        enableReadyCheck: true
      });
    } catch (err) {
      new ServerError({
        message: 'Redis client init error.',
        internalCode: ErrorCodes.cacheInitError,
        internal: true,
      }).log();

      if (RedisClient.instance) RedisClient.instance.quit();
      return undefined;
    }
  }

  async get(key: string): Promise<someType> {
    ...
  }

  async set<T extends Record<string, unknown>>(key: string, value: Stringified<T> | string): Promise<void> {
    ...
  }

  async del(key: string): Promise<void> {
    ...
  }

  async flush(): Promise<void> {
    ...
  }
}
代码语言:javascript
复制
import RedisClient from 'somewhere';

const redis = await RedisClient.init();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31349033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档