我正在为Node.js使用Redis库-我可以监听连接‘就绪’事件,如下所示
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,看看它是否已经准备好了,而不是在准备好处理之前侦听可能会触发的事件呢?
我想我可以放弃就绪事件,只执行一个查询,然后等待响应,但是有更好、更安全和更复杂的方法吗?
换句话说,我很可能不得不写一个这样的函数:
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
});
}
}这看起来一点也不对,一定有更好的办法
发布于 2015-07-14 03:17:31
节点-redis客户端会在连接准备好之前自动排队发送任何命令。一旦连接,这些命令都会在.on(“准备好”)触发之前发送。因此,您实际上不需要使用.on(“就绪”)。如果您发送的命令太早,它们仍将按预期进行,如果连接完全失败,它们将永远不会被发送。
发布于 2021-12-10 00:56:11
即使命令是排队的,我还是遇到了一些令人讨厌的日志记录错误,因为我在DB未完全加载时发送命令。connect事件是不够的。
从医生那里:
options.enableReadyCheck布尔 当建立到Redis服务器的连接时,服务器可能仍在从磁盘加载数据库。加载时,服务器不响应任何命令。为此,当此选项为真时,ioredis将检查Redis服务器的状态,当Redis服务器能够处理命令时,将发出一个就绪事件。
因此,只有使用ioredis库才能使它可靠地工作:
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> {
...
}
}import RedisClient from 'somewhere';
const redis = await RedisClient.init();https://stackoverflow.com/questions/31349033
复制相似问题