在redis集群中如何获取节点redis客户端通过命令HMSET设置的整个集群的数据?
In redis cluster how to get the data of whole cluster which is set by command HMSET by node redis client?
是否可以通过HSCAN命令,只提供单个节点的主机和端口,自动检测集群节点并给出所有数据?
目前通过遍历所有节点进行了临时修复。
具体如何操作取决于您使用的客户端。
一般redis使用XModem CRC 16算法来判断key存放在哪里,查看源码: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
桶只有两种语法。
- 1-125 - 从 1 到 125
- 1,3,5 - 存储桶 1、3 和 5
- 1-10,15,18,20-100 - 以上两个的混合
还有一件事,redis 在集群模式下支持 Hashtags,如果键看起来像 hello{world}
crc16 我们只在 'hello' 上做而没有 '{world}' crc16('hello')
这可以帮助您将密钥存储在同一实例上..
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 ***');
});
是否可以通过HSCAN命令,只提供单个节点的主机和端口,自动检测集群节点并给出所有数据?
目前通过遍历所有节点进行了临时修复。
具体如何操作取决于您使用的客户端。
一般redis使用XModem CRC 16算法来判断key存放在哪里,查看源码: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
桶只有两种语法。
- 1-125 - 从 1 到 125
- 1,3,5 - 存储桶 1、3 和 5
- 1-10,15,18,20-100 - 以上两个的混合
还有一件事,redis 在集群模式下支持 Hashtags,如果键看起来像 hello{world}
crc16 我们只在 'hello' 上做而没有 '{world}' crc16('hello')
这可以帮助您将密钥存储在同一实例上..
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 ***');
});