在redis集群中如何通过节点redis客户端获取由命令HMSET设置的整个集群的数据?

时间:2017-04-27 13:30:10

标签: node.js redis node-redis

是否有可能通过HSCAN命令,只提供单个节点的主机和端口,它自动检测集群节点并提供所有数据?

目前通过迭代所有节点进行临时修复。

2 个答案:

答案 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

存储桶只有两种语法。

  1. 1-125 - 从1到125
  2. 1,3,5 - 1号桶和3号和5号
  3. 1-10,15,18,20-100 - 只是两个以上的混合
  4. 还有一件事,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 ***');
     });