как получить все ключи и значения в redis в javascript?

Я создаю API узла с помощью javascript. Я использовал redis в качестве хранилища ключевых значений. Я создал направле-клиент в мое приложение, и я могу получить значения для ключа определенным.

Я хочу получить все ключи вместе с их значениями. До сих пор я делал это :

app.get('/jobs', function (req, res) {
    var jobs = [];
    client.keys('*', function (err, keys) {
        if (err) return console.log(err);
        if(keys){
            for(var i=0;i<keys.length;i++){
                client.get(keys[i], function (error, value) {
                    if (err) return console.log(err);
                    var job = {};
                    job['jobId']=keys[i];
                    job['data']=value;
                    jobs.push(job);
                });  
            }
            console.log(jobs);
            res.json({data:jobs});
        }
    });
});

но я всегда получаю пустой массив в ответ.

есть ли способ сделать это в JavaScript?

спасибо

6 ответов


прежде всего, проблема в вашем вопросе заключается в том, что внутри for цикл client.get вызывается с асинхронные обратный вызов, где синхронно for цикл не будет ждать асинхронного обратного вызова и, следовательно, следующей строки res.json({data:jobs}); вызывается сразу после for цикл перед асинхронными обратными вызовами. В момент очереди res.json({data:jobs}); легко, массив jobs пуст [] и возвращение с ответ.

чтобы смягчить это, вы должны использовать любые модули promise, такие как async, bluebird, ES6 Promise etc.

измененный код с помощью асинхронные модуль

app.get('/jobs', function (req, res) {
    var jobs = [];
    client.keys('*', function (err, keys) {
        if (err) return console.log(err);
        if(keys){
            async.map(keys, function(key, cb) {
               client.get(key, function (error, value) {
                    if (error) return cb(error);
                    var job = {};
                    job['jobId']=key;
                    job['data']=value;
                    cb(null, job);
                }); 
            }, function (error, results) {
               if (error) return console.log(error);
               console.log(results);
               res.json({data:results});
            });
        }
    });
});

а от Redis документация, отмечается, что использование Ключи предназначены для отладки и специальных операций, таких как изменение макета скорости и не рекомендуется для производства окружающая среда.

следовательно, я бы предложил использовать другой модуль под названием redisscan как ниже, который использует SCAN вместо KEYS как полагают в Redis документация.

что-то вроде

var redisScan = require('redisscan');
var redis     = require('redis').createClient();


redisScan({
        redis: redis,
        each_callback: function (type, key, subkey, value, cb) {
            console.log(type, key, subkey, value);
            cb();
        },
        done_callback: function (err) {
            console.log("-=-=-=-=-=--=-=-=-");
            redis.quit();
        }
    });

Это получит все ключи, но без значений:

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

client.keys('*', (err, keys) => {
  // ...
});

Теперь вам нужно получить значения для этих ключей обычным способом. Например:

Promise.all(keys.map(key => client.getAsync(key))).then(values => {
  // ...
});

или async модуль или любым другим способом.


если client это Object потом просто сделать :

var keys = Object.keys(client);
var values = Object.values(client);

вы получите массив ключей и массив значений. Что в индексе I в значениях-это value соответствующий ключу, расположенному по индексу I в keys.


вы никогда не должны делать этого. Во-первых, не рекомендуется использовать KEYS * в производстве. Во-вторых, это не масштабирование (кластер).

вы можете организовать кэшированные записи в наборы и запросить элементы в наборе, а затем получить ключи ссылок. Это также облегчает аннулирование.

взгляните на некоторые рекомендации по хранению данных.

https://redis.io/topics/data-types-intro как получить все ключи и значения в redis в javascript?


вы можете найти что-то полезное в этой ссылке

https://github.com/NodeRedis/node_redis/tree/master/examples


комбинация из 2 запросов:

import * as ioredis from 'ioredis';

const redis = new ioredis({
    port: redisPort,
    host: redisServer,
    password: '',
    db: 0
  });

const keys = await redis.collection.keys('*');
const values = await redis.collection.mget(keys);

порядок будет одинаковым для обоих массивов.