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

how to get all keys and values in redis in javascript?

我正在使用 javascript 创建节点 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 中有什么方法可以做到这一点吗?

谢谢

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

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

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

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

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

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

首先,您问题中的问题是,在 for 循环内,client.get 是通过 异步 回调调用的,其中 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 as below which uses SCAN instead of KEYS as suggested in the Redis 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();
        }
    });

你永远不应该这样做。首先,不建议在生产中使用 KEYS *。其次,这不会扩展(集群)。

您可以将缓存的条目组织到 SET 中并查询 SET 中的项目,然后检索引用键。这也使失效更容易。

查看一些数据存储最佳做法。

https://redis.io/topics/data-types-intro

您可能会在本文中找到有用的东西 link

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

两个数组的顺序相同。