如何在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.get
被asynchronouscallback调用,其中同步 for
循环不会等待asynchronouscallback,因此下一行res.json({data:jobs});
在asynchronouscallback之前的for
循环之后立即被调用。 在线res.json({data:jobs});
被调用时,数组jobs
仍然是空的[]
并返回响应。
为了减轻这一点,你应该使用任何承诺模块,如async
, bluebird
, ES6 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
代替KEYS
如Redis
文档中所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