node_red - обновление информации об используемой памяти

Я использую клиент 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 без создания нового клиента каждый раз?


person Junker    schedule 01.11.2018    source источник
comment
Вы пробовали позвонить redisClient.info()?   -  person freakish    schedule 01.11.2018
comment
redisClient.info() просто возвращает true   -  person Junker    schedule 01.11.2018
comment
Это асинхронный вызов. Вы используете его, как и другие вызовы, например redisClient.info(function(err, res) { console.log(res); });.   -  person freakish    schedule 01.11.2018
comment
ах, да, я теперь видел это в исходном коде node_redis. Однако res - это просто огромная строка, содержащая ту же информацию, что и команда redis-cli info. Не уверен, как мне получить доступ к значению used_memory из этой строки. Я мог бы попробовать регулярное выражение ...   -  person Junker    schedule 01.11.2018
comment
Ну надо разобрать :)   -  person freakish    schedule 01.11.2018
comment
@Junker, не могли бы вы проверить ответ и пометить его как принятый, если он работает? в противном случае оставьте комментарий   -  person mihai    schedule 07.11.2018


Ответы (3)


Это поможет:

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

person mihai    schedule 05.11.2018

Ответ Михая работает, но я предупреждаю, что значение line.split(":")[1] имеет скрытый \r в конце строки. При использовании в конце оператора консоли это не будет проблемой, но вам нужно удалить \r, если вы хотите использовать значение в середине оператора журнала, иначе полученный console.log будет искажен .

person JimblyJambles    schedule 14.10.2020

Это гораздо более чистый ответ на ответ Михая и, вероятно, лучший для использования в производственной среде.

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);
person Epic Speedy    schedule 21.12.2020