是否有可能通过HSCAN命令,只提供单个节点的主机和端口,它自动检测集群节点并提供所有数据?
目前通过迭代所有节点进行临时修复。
答案 0 :(得分:0)
如何做到这一点取决于您使用的客户。
通常redis使用XModem CRC 16算法来确定存储密钥的位置,请检查以下源代码:https://github.com/h0x91b/fast-redis-cluster/blob/remake/index.js#L92:L175
要知道实际存储的密钥在哪里,你应该计算密钥名称的xmodem crc16,然后取模块16384.结果是bucket number
,现在你可以使用CLUSTER NODES
命令来确定服务器服务这个桶..
例如,我们的密钥名称为123456789
123456789
的crc16是12739
12739%16384 = 12739,所以我们的广告资源为12739
然后运行CLUSTER NODES
命令,无论在哪个master \ slave服务器上。
你会看到这样的事情:
2339fe27bd311835712965a764839b4acaf41d5c 127.0.0.1:7012@17012 slave b43c92c05670537a60bcbf5430fef5e66ddebbcf 0 1493302253929 4 connected
f3007f3c2bc3a2826a3ed8e54a5e651e7457161a 127.0.0.1:7001@17001 myself,master - 0 0 0 connected 0-8191
1a054a84924109d277133bc1c14b0266f21b9f29 127.0.0.1:7003@17003 master - 0 1493302250907 3 connected 16383
577877f65e2c57a60849f242a2e740e822642431 127.0.0.1:7011@17011 slave f3007f3c2bc3a2826a3ed8e54a5e651e7457161a 0 1493302254932 1 connected
b43c92c05670537a60bcbf5430fef5e66ddebbcf 127.0.0.1:7002@17002 master - 0 1493302249900 1 connected 8192-16382
47bf2c2f5e2e6acf10dff8568f8212a014335a5c 127.0.0.1:7013@17013 slave 1a054a84924109d277133bc1c14b0266f21b9f29 0 1493302252924 3 connected
每一行都是服务器。 2339fe27bd311835712965a764839b4acaf41d5c
是服务器的id,然后是ip地址和端口,标志和设置。
我们需要找到包含标记master
的行,在此行的末尾,您将看到此服务器正在托管的存储区。
在我的情况下,需要的是:
b43c92c05670537a60bcbf5430fef5e66ddebbcf 127.0.0.1:7002@17002 master - 0 1493302249900 1 connected 8192-16382
8192-16382
<<<这个服务器服务桶8192,8193,8194 ... 16382(包含)所以我们的密钥位于服务器127.0.0.1:7002
存储桶只有两种语法。
还有一件事,redis支持群集模式下的Hashtags,如果密钥看起来像hello{world}
crc16我们只在'hello'上没有'{world}'crc16('hello')
,这可以帮助你存储同一个实例上的密钥..
答案 1 :(得分:0)
node-redis和node-redis-streamify的组合给了我预期的结果......
var redis = require("redis");
require('node-redis-streamify')(redis);
// Host and port of single node
var client = redis.createClient({host:xyz, port:xyz});
var pattern = '*', count = 1000, hscan = client.streamified('HSCAN');
hscan(key, pattern, count)
.on('data', function (data) {
console.log('hscan data ***', data);
})
.on('error', function (error) {
console.log('hscan error ***', error);
})
.on('end', function () {
console.log('hscan end ***');
});