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

标签 javascript node.js redis key-value

我正在使用 javascript 创建一个 Node API。我使用 redis 作为我的键值存储。 我在我的应用程序中创建了一个 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中做到这一点?

谢谢

最佳答案

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

为了缓解这种情况,您应该使用任何 Promise 模块,例如 asyncbluebirdES6 Promise 等。

使用 async 修改代码模块,

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});
            });
        }
    });
});

But from the Redis documentation, it is observed that usage of Keys are intended for debugging and special operations, such as changing your keyspace layout and not advisable to production environments.

因此,我建议使用另一个名为 redisscan 的模块如下使用 SCAN 而不是 KEYSRedis documentation 中所建议的那样.

类似的,

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();
        }
    });

关于javascript - 如何在javascript中获取redis中的所有键和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42926990/

相关文章:

javascript - 滚动sidenav时如何防止滚动主要部分

php - 上传没有表格的文件

javascript - 如何将这两个函数合并为一个 Javascript 函数?

Node.js For 循环异步请求

python - RQ worker 抛出 "ValueError"

php - memcache、memcached和redis的区别

javascript - 通过单击弹出窗口外部来关闭弹出窗口

javascript - Node js 在嵌套的 fs.readFile 调用中给出未定义的数据

module - Node.JS错误: Cannot find module 'posix' (using Cygwin)

lua - 如何提高Redis服务器的CPU使用率?