как получить все ключи и значения в redis в javascript?
Я создаю API узла с помощью javascript. Я использовал 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?
спасибо
6 ответов
прежде всего, проблема в вашем вопросе заключается в том, что внутри for
цикл client.get
вызывается с асинхронные обратный вызов, где синхронно for
цикл не будет ждать асинхронного обратного вызова и, следовательно, следующей строки res.json({data:jobs});
вызывается сразу после for
цикл перед асинхронными обратными вызовами. В момент очереди res.json({data:jobs});
легко, массив jobs
пуст []
и возвращение с ответ.
чтобы смягчить это, вы должны использовать любые модули promise, такие как async
, bluebird
, ES6 Promise
etc.
измененный код с помощью асинхронные модуль
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
документация, отмечается, что использование Ключи предназначены для отладки и специальных операций, таких как изменение макета скорости и не рекомендуется для производства окружающая среда.
следовательно, я бы предложил использовать другой модуль под названием 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();
}
});
Это получит все ключи, но без значений:
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);
вы получите массив ключей и массив значений.
Что в индексе I в значениях-это value
соответствующий ключу, расположенному по индексу I в keys
.
вы никогда не должны делать этого. Во-первых, не рекомендуется использовать KEYS *
в производстве. Во-вторых, это не масштабирование (кластер).
вы можете организовать кэшированные записи в наборы и запросить элементы в наборе, а затем получить ключи ссылок. Это также облегчает аннулирование.
взгляните на некоторые рекомендации по хранению данных.
https://redis.io/topics/data-types-intro как получить все ключи и значения в redis в javascript?
вы можете найти что-то полезное в этой ссылке
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);
порядок будет одинаковым для обоих массивов.