Bhu*_*kar 11 javascript key-value redis node.js
我正在使用javascript创建节点API.我使用redis作为我的键值存储.我在我的应用程序中创建了一个redis-client,并且能够获得特定密钥的值.
我想检索所有键及其值.到目前为止,我做到了这一点:
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});
}
});
});
Run Code Online (Sandbox Code Playgroud)
但我总是得到空白阵列作为回应.
有没有办法在javascript中执行此操作?
谢谢
Aru*_*una 11
首先,您的问题中的问题是,在for循环内部,client.get使用异步回调调用,其中同步 for循环不会等待异步回调,因此在异步回调之前的循环之后res.json({data:jobs});立即调用下一行for.在res.json({data:jobs});调用该行时,该数组jobs仍为空,[]并返回响应.
为了缓解这种情况,您应该使用任何承诺模块,如async,bluebird,ES6 Promise等.
使用异步模块修改代码,
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});
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
但是从
Redis文档中可以看出,Keys的使用是用于调试和特殊操作,例如更改键空间布局而不适用于生产环境.
因此,我建议使用另一个名为redisscan的模块,如下所示,SCAN而不是文档中KEYS建议的那样.Redis
就像是,
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();
}
});
Run Code Online (Sandbox Code Playgroud)
这将获取所有键但没有值:
const redis = require('redis');
const client = redis.createClient();
client.keys('*', (err, keys) => {
// ...
});
Run Code Online (Sandbox Code Playgroud)
现在您需要以通常的方式获取这些键的值。例如:
Promise.all(keys.map(key => client.getAsync(key))).then(values => {
// ...
});
Run Code Online (Sandbox Code Playgroud)
或使用async模块或以您喜欢的任何方式。
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);
Run Code Online (Sandbox Code Playgroud)
两个阵列的顺序相同。
| 归档时间: |
|
| 查看次数: |
15893 次 |
| 最近记录: |