Javascript 使用PM2和NodeJ在多个进程之间共享的单个用户列表

Javascript 使用PM2和NodeJ在多个进程之间共享的单个用户列表,javascript,node.js,pm2,Javascript,Node.js,Pm2,在多个进程之间共享单个用户列表的最佳方式是什么?。这些过程是使用PM2启动的 这些进程将有权访问该列表,以便添加、删除和检查列表中是否已经存在用户 最简单的方法是使用redis(或memocache,甚至mongodb)来存储这些用户列表 或者,在您的情况下,您将不得不处理非常复杂的IPC,因为pm2基于子进程使用节点群集。您可以使用内存中的数据存储,如Redis Redis作为一个单独的进程运行,并在TCP端口上提供请求(默认为6379)。Redis是一个键值数据存储,可供所有节点进程使用 以

在多个进程之间共享单个用户列表的最佳方式是什么?。这些过程是使用PM2启动的


这些进程将有权访问该列表,以便添加、删除和检查列表中是否已经存在用户

最简单的方法是使用redis(或memocache,甚至mongodb)来存储这些用户列表


或者,在您的情况下,您将不得不处理非常复杂的IPC,因为pm2基于子进程使用节点群集。

您可以使用内存中的数据存储,如Redis

Redis作为一个单独的进程运行,并在TCP端口上提供请求(默认为6379)。Redis是一个键值数据存储,可供所有节点进程使用

以下是您如何做到这一点:

  • 列表项
  • 安装redis。()
  • 为redis安装节点客户端:
  • npm安装--保存redis

  • 现在,您可以使用redis存储应用程序状态数据,并在多个进程中共享这些数据
    请参阅链接以获取代码示例。

    我刚刚使用redis为多达1200个实例的大型网络爬虫系统编写了一个作业跟踪记录器

    好的!让我们做吧

    首先,您需要定义它:

    const redis = require("redis");
    const client_redis = redis.createClient({
      retry_strategy: function(options) {
        if (options.error && options.error.code === "ECONNREFUSED") {
          // End reconnecting on a specific error and flush all commands with
          // a individual error
          return new Error("The server refused the connection");
        }
        if (options.total_retry_time > 1000 * 60 * 60) {
          // End reconnecting after a specific timeout and flush all commands
          // with a individual error
          return new Error("Retry time exhausted");
        }
        if (options.attempt > 10) {
          // End reconnecting with built in error
          return undefined;
        }
        // reconnect after
        return Math.min(options.attempt * 100, 3000);
      },
    });
    
    此函数用于更新和创建日志

    function create_and_update_log(productName2, url2, proc, msg) {
        var data_value = {
            id: 'BESTBUY::DATA_LOG::'+md5(productName2 + url2),
            totalrv: 'WAIT',
            product: productName2,
            url: url2,
            process: proc,
            task: msg,
            timestamp: moment().format('DD/MM/YYYY HH:mm:ss')
        };
    
        client_redis.set('BESTBUY::DATA_LOG::'+md5(productName2 + url2), JSON.stringify(data_value));
    }
    
    此函数用于查询所有数据

    async function get_log_redis() {
        return new Promise(function(resolve, reject) {
            try {
                var logger_data = {
                    logger: []
                };
                client_redis.multi()
                    .keys('BESTBUY::DATA_LOG::*', function(err, replies) {
                        replies.forEach(function(reply, index) {
                            client_redis.get(reply, function(err, data) {
                                if (!data.includes("Total reviews left: 0")) {
                                    logger_data.logger.push(JSON.parse(data));
                                }
    
                                if (index == replies.length - 1) {
                                    resolve(logger_data);
                                }
                            });
                        });
    
                    })
                    .exec(function(err, replies) {});
            } catch (err) {
                console.log(err);
            }
        });
    }
    
    记住更换:

    BESTBUY::DATA_LOG::
    
    。。。用你想要定义的东西

    最后一个问题是如何获取属于我的密钥名的所有日志,以“BESTBUY::DATA_log:”开头

                var log_obj_data = "";
                (async () => {
                    var log_obj_data = await get_log_redis();
    
                    response.writeHead(200, {
                        "Content-Type": "application/json"
                    });
                    response.end(JSON.stringify(log_obj_data));
                })();