如何在javascript中获取redis中的所有键和值?
how to get all keys and values in redis in javascript?
我正在使用 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 中有什么方法可以做到这一点吗?
谢谢
这将获取所有键但没有值:
const redis = require('redis');
const client = redis.createClient();
client.keys('*', (err, keys) => {
// ...
});
现在您需要以通常的方式获取这些键的值。例如:
Promise.all(keys.map(key => client.getAsync(key))).then(values => {
// ...
});
或使用 async
模块或您喜欢的任何方式。
首先,您问题中的问题是,在 for
循环内,client.get
是通过 异步 回调调用的,其中 synchronous for
循环不会等待异步回调,因此下一行 res.json({data:jobs});
在异步回调之前的 for
循环之后立即被调用。在调用行 res.json({data:jobs});
时,数组 jobs
仍然是空的 []
并随响应一起返回。
为了缓解这种情况,您应该使用任何 promise 模块,例如 async
、bluebird
、ES6 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});
});
}
});
});
But from the Redis
documentation, it is observed that usage of
Keys are intended for debugging and special operations, such as
changing your keyspace layout and not advisable to production
environments.
因此,我建议使用另一个名为 redisscan as below which uses SCAN
instead of KEYS
as suggested in the 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();
}
});
你永远不应该这样做。首先,不建议在生产中使用 KEYS *
。其次,这不会扩展(集群)。
您可以将缓存的条目组织到 SET 中并查询 SET 中的项目,然后检索引用键。这也使失效更容易。
查看一些数据存储最佳做法。
您可能会在本文中找到有用的东西 link
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);
两个数组的顺序相同。
我正在使用 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 中有什么方法可以做到这一点吗?
谢谢
这将获取所有键但没有值:
const redis = require('redis');
const client = redis.createClient();
client.keys('*', (err, keys) => {
// ...
});
现在您需要以通常的方式获取这些键的值。例如:
Promise.all(keys.map(key => client.getAsync(key))).then(values => {
// ...
});
或使用 async
模块或您喜欢的任何方式。
首先,您问题中的问题是,在 for
循环内,client.get
是通过 异步 回调调用的,其中 synchronous for
循环不会等待异步回调,因此下一行 res.json({data:jobs});
在异步回调之前的 for
循环之后立即被调用。在调用行 res.json({data:jobs});
时,数组 jobs
仍然是空的 []
并随响应一起返回。
为了缓解这种情况,您应该使用任何 promise 模块,例如 async
、bluebird
、ES6 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});
});
}
});
});
But from the
Redis
documentation, it is observed that usage of Keys are intended for debugging and special operations, such as changing your keyspace layout and not advisable to production environments.
因此,我建议使用另一个名为 redisscan as below which uses SCAN
instead of KEYS
as suggested in the 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();
}
});
你永远不应该这样做。首先,不建议在生产中使用 KEYS *
。其次,这不会扩展(集群)。
您可以将缓存的条目组织到 SET 中并查询 SET 中的项目,然后检索引用键。这也使失效更容易。
查看一些数据存储最佳做法。
您可能会在本文中找到有用的东西 link
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);
两个数组的顺序相同。