gpt4 book ai didi

node.js - 如何将redis与node js集群一起使用

转载 作者:IT王子 更新时间:2023-10-29 06:09:31 27 4
gpt4 key购买 nike

我一直在使用 redis 作为我的 nodejs 服务器的内存存储。 session 也由 Redis 管理。

目前我一直在做的是,只要我的服务器连接到它,我就会刷新我的redis,这样每当服务器启动时就没有 session

像这样:

redisClient.on('connect', function () {
redisClient.flushdb(function (err, succeeded) {
logger.debug("redis db cleared on startup--", succeeded); // will be true if successfull
});
});

我还使用 redis 来存储一些其他数据,比如一些 queue

但现在我想在我的服务器上实现集群。

我的问题是如果我有 4 个核心,4 个 Node 实例将在我的服务器上运行。

num_processes = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
var workers = [];

// Helper function for spawning worker at index 'i'.
var spawn = function(i) {
console.log("spawing at index---",i);
workers[i] = cluster.fork();
console.log("----worker id-------", workers[i].id,"-------");
// Optional: Restart worker on exit
workers[i].on('exit', function(code, signal) {
console.log(`code is ${code} and signal is ${signal}`)
console.log(`worker ${workers[i].process.pid} died array index is ---${i}`);
console.log('respawning worker', i);
spawn(i);
});
workers[i].on('listening', () => {
workers[i].send({'index' : i });
});
};

// Spawn workers.
for (var i = 0; i < num_processes; i++) {
spawn(i);
} // Code to run if we're in a worker process
} else {
var redis = require('redis');
const sio_redis = require('socket.io-redis'),

redisClient = redis.createClient();
redisClient.on('connect', function () {
redisClient.flushdb(function (err, succeeded) {
logger.debug("redis db cleared on startup--", succeeded); // will be true if successfull
});
});

var RedisStore = require('connect-redis')(session);
const redisStore = new RedisStore({'host': 'localhost', 'port': 6379, 'client': redisClient});
var server = require('http').Server(app);
var listeningServer = server.listen(3002);
}

如果任何实例由于某种原因退出或死亡,它将清除redis中的所有 session 和数据

我不希望这样的事情发生。在这种情况下,我应该如何使用 Redis,以便清除与该实例对应的 session 和数据?

最佳答案

您可以检查当前进程是否为master。这样它只会在您第一次启动应用程序时刷新。如果任何 fork 重新启动,那么它不会刷新数据库。

redisClient = redis.createClient();
redisClient.on('connect', function() {
if (cluster.isMaster) {
redisClient.flushdb(function(err, succeeded) {
logger.debug("redis db cleared on startup--", succeeded); // will be true if successfull
});
}else{
logger.debug("Forked instance no need to flush redis db"); //
}
});

关于node.js - 如何将redis与node js集群一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49294249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com