node_redis更新已用内存信息

时间:2018-11-01 15:34:26

标签: node.js redis node-redis

我正在使用node_redis客户端,并且想监视Redis当前使用的内存量:

const redis = require('redis');
const redisClient = redis.createClient();

setInterval(() => {
  // add much data to redis, then:
  console.log(redisClient.server_info.used_memory);
}, 1000);

这在每个间隔记录相同的内存量。但是,如果我使用redis-cli“ info”命令,则可以看到内存增加。

我想出的唯一解决方案是每次我要检查内存时都创建一个新客户端:

const redis = require('redis');

setInterval(() => {
  // add much data to redis, then create new client to watch memory:
  const redisClient = redis.createClient();
  console.log(redisClient.server_info.used_memory);
  redisClient.quit();
}, 1000);

但是,这感觉不正确。有没有一种方法可以“更新” used_memory信息而无需每次都创建新客户端?

3 个答案:

答案 0 :(得分:0)

这可以解决问题:

setInterval(() => {
  redisClient.info((req, res) => {
    res.split("\n").map((line) => {
      if (line.match(/used_memory_human/)) {
        console.log('Used memory: ' + line.split(":")[1]);
      }
    })
  });
}, 1000);

它将按行分割info输出的输出,并打印包含used_memory_human的行的值

答案 1 :(得分:0)

Mihai的答案有效,但是我要警告line.split(":")[1]的值在字符串的末尾有一个隐藏的\r。在控制台语句的末尾使用时,这不会有问题,但是如果要在日志语句的中间使用该值,则需要删除\r,否则将要使用控制台。日志会出现乱码。

答案 2 :(得分:0)

这是对 Mihai 的一个更简洁的答案,并且可能是在生产环境中使用的最佳答案。

setInterval(() => {
    redisClient.info((err, info) => {
        if (err) throw err;
        
        const used = info.split("\n").find(line => line.match(/used_memory_human/)).split(":")[1];

        console.log("Used Memory:", used);
    });
}, 1000);