我正在使用这个
redisManager.redisClient.keys('*example*', function (err, keys) {
})
但它只提供来自其中一个 redis 集群的密钥。如何从所有集群中获取密钥?
我正在使用这个
redisManager.redisClient.keys('*example*', function (err, keys) {
})
但它只提供来自其中一个 redis 集群的密钥。如何从所有集群中获取密钥?
您可以使用此代码从所有集群中查找密钥。请参阅链接了解更多信息。
var RedisCluster = require('node-redis-cluster').RedisCluster;
var rcluster = RedisCluster.create([
{ port: 6379, host: '10.0.0.1' },
{ port: 6379, host: '10.0.0.2' },
{ port: 6379, host: '10.0.0.3' },
]);
rcluster.execAll('keys', ['*'], function(err, results) {
/* results will be
{
'10.0.0.1:6379': [ // keys],
'10.0.0.2:6379': [ // keys],
'10.0.0.3:6379': [ // keys]
}
*/
});
您无法使用单个命令获取所有节点的密钥。您必须获取所有节点的密钥并将它们合并。参考 - https://github.com/antirez/redis/issues/1962
你可以做类似的事情。
var redis = require('redis');
redisConfig = new Array(
{"port": 1234, "host": "192.168.1.2"},
{"port": 5678, "host": "192.168.1.3"}
);
keys = new Array();
allKeys = new Array();
for(i = 0; i < redisConfig.length; i++){
redisClient = redis.createClient(redisConfig[i].port, redisConfig[i].host);
keys[i] = redisClient.keys('*example*', function (err, keys) {
allkeys = [...new Set([...allKeys ,...keys[i]])];
})
}
您是否尝试过使用该node-redisscan
软件包?它允许您SCAN
在 Redis 集群上使用命令。
您必须使用回调收集每个匹配的键。这是你的做法(直接从自述文件中提取) -
var redisScan = require('redisscan');
var redis = require('redis').createClient();
redisScan({
redis: redis,
each_callback: function (type, key, subKey, value, done) {
console.log(type, key, subKey, value);
done();
},
done_callback: function (err) {
if (err) throw err;
redis.quit();
}
});
不建议在生产模式下使用 Keys 命令。
来自 redis docs 警告:将 KEYS 视为仅应在生产环境中极其小心地使用的命令。当它针对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用 KEYS。如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用 SCAN 或集合。
使用 scanStream 代替
redisConnection = redisConnectionObject;
const slaves = redisConnection.nodes("slave");
config.info('number of slaves', slaves.length)
let keys = [];
let slavePromises = [];
slaves.forEach((slave) => {
let slaveCreate = new Promise((resolve) => {
const stream = slave.scanStream({
match: prefix
});
stream.on("data", (resultKeys) => {
keys = [...keys, ...resultKeys];
});
stream.on("end", () => {
resolve();
});
});
slavePromises.push(slaveCreate);
});
Promise.all(slavePromises).then(([slaveOneData, slaveTwoData]) => {
keys = _.uniq(keys);
resolveOne(keys);
});
运行命令$ npm install redis
安装redis。
var redis = require('redis'),
client = redis.createClient();
client.keys('*', function (err, keys) {
if (err) return console.log(err);
for(var i = 0, len = keys.length; i < len; i++) {
console.log(keys[i]);
}
});