如何在JavaScript中获得redis中的所有键和值?

我正在使用JavaScript创build节点API。 我用redis作为我的关键价值商店。 我在我的应用程序中创build了一个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.getasynchronouscallback调用,其中同步 for循环不会等待asynchronouscallback,因此下一行res.json({data:jobs}); 在asynchronouscallback之前的for循环之后立即被调用。 在线res.json({data:jobs}); 被调用时,数组jobs仍然是空的[]并返回响应。

为了减轻这一点,你应该使用任何承诺模块,如asyncbluebirdES6 Promise

使用asynchronous模块修改代码,

 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 文档中可以看出,Keys的使用是为了debugging和特殊操作,例如更改您的密钥空间布局,而不build议在生产环境中使用。

因此,我build议使用另一个名为redisscan的模块,如下所示,它使用SCAN代替KEYSRedis 文档中所build议的。

就像是,

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

两个请求的组合:

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

这两个数组的顺序是相同的。

这将得到所有的键,但没有值:

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

您将获得一组键和一组值。 我在值中的索引是什么是对应于位于索引我在keys中的keys

你不应该这样做。 首先,不build议在生产中使用KEYS * 。 其次,这没有规模(集群)。

您可以将caching条目组织到SET中,然后查询SET中的项目,然后检索参考项。 这也使失效更容易。

看看一些数据存储的最佳实践。

https://redis.io/topics/data-types-intro 如何获取所有的键和值在JavaScript中的redis?

您可能会在这个链接中find有用的东西

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