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

Posted

技术标签:

【中文标题】如何在javascript中获取redis中的所有键和值?【英文标题】:how to get all keys and values in redis in javascript? 【发布时间】:2017-08-13 02:40:57 【问题描述】:

我正在使用 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中做到这一点?

谢谢

【问题讨论】:

来吧,@Bhushan -- 拥有 3K 分,你会比在没有任何代码的情况下提出问题更好...... Redis command to get all available keys?的可能重复 @MoshMage 我添加了代码。抱歉,我有点忙 ***.com/a/38247686/3784008 @BhushanGadekar 你可以在下面查看我的答案。 【参考方案1】:

首先,您的问题中的问题是,在for 循环中,client.get 是通过 异步 回调调用的,其中 同步 @987654327 @ 循环不会等待异步回调,因此下一行 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);
            );
        
    );
);

但是从Redisdocumentation可以看出, 密钥用于调试和特殊操作,例如 更改您的键空间布局,不建议用于生产 环境。

因此,我建议使用另一个名为redisscan 的模块,如下所示,它使用SCAN 而不是KEYS,如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();
        
    );

【讨论】:

【参考方案2】:

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

两个数组的顺序相同。

【讨论】:

这不起作用。没有钥匙属性 我真正想知道的是如何限制键 @rakesht - 看起来就在那里 github.com/luin/ioredis/issues/828#issuecomment-476716136 如果要限制则使用扫描方法获取密钥,它快速可靠且无阻塞..【参考方案3】:

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

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

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

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

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

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

【讨论】:

值得一提的是,文档明确指出不应使用此命令来执行此操作 @baao 是的。我认为获取所有键和所有值是证明 Redis 在这里以一种奇怪的方式使用的需要。不幸的是,问题是关于解决方案,而不是问题,因此很难推荐其他任何东西。 Redis 在这里的使用方式很奇怪 没错。 :D 尽管有问题,但更好的解决方案是使用SCAN 而不是KEYS【参考方案4】:

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

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

了解一些数据存储最佳做法。

https://redis.io/topics/data-types-intro how to get all keys and values in redis in javascript?

【讨论】:

【参考方案5】:

您可能会在此链接中找到有用的东西

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

【讨论】:

以上是关于如何在javascript中获取redis中的所有键和值?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取redis内的所有内容

如何从 JavaScript 中的字符串中获取所有数字? [复制]

如何使用 Javascript 获取选定文本中的所有 HTML 选择标签?

显示 redis 中的所有键 - 在一行中

redis如何查看所有key中的类型为string的清单?

使用python获取Redis数据库中的所有键