如何在javascript中获取redis中的所有键和值?

Bhu*_*kar 11 javascript key-value redis node.js

我正在使用javascript创建节点API.我使用redis作为我的键值存储.我在我的应用程序中创建了一个redis-client,并且能够获得特定密钥的值.

我想检索所有键及其值.到目前为止,我做到了这一点:

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});
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

但我总是得到空白阵列作为回应.

有没有办法在javascript中执行此操作?

谢谢

Aru*_*una 11

首先,您的问题中的问题是,在for循环内部,client.get使用异步回调调用,其中同步 for循环不会等待异步回调,因此在异步回调之前的循环之后res.json({data:jobs});立即调用下一行for.在res.json({data:jobs});调用该行时,该数组jobs仍为空,[]并返回响应.

为了缓解这种情况,您应该使用任何承诺模块,如async,bluebird,ES6 Promise等.

使用异步模块修改代码,

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});
            });
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

但是从Redis 文档中可以看出,Keys的使用是用于调试和特殊操作,例如更改键空间布局而不适用于生产环境.

因此,我建议使用另一个名为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();
        }
    });
Run Code Online (Sandbox Code Playgroud)


rsp*_*rsp 5

这将获取所有键但没有值:

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

client.keys('*', (err, keys) => {
  // ...
});
Run Code Online (Sandbox Code Playgroud)

现在您需要以通常的方式获取这些键的值。例如:

Promise.all(keys.map(key => client.getAsync(key))).then(values => {
  // ...
});
Run Code Online (Sandbox Code Playgroud)

或使用async模块或以您喜欢的任何方式。


Iur*_*ilo 5

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);
Run Code Online (Sandbox Code Playgroud)

两个阵列的顺序相同。