¿Es posible mediante el comando HSCAN, solo proporcionando el host y el puerto de un solo nodo, que detecta automáticamente el nodo del clúster y proporciona todos los datos?
actualmente hizo una solución temporal iterando a través de todo el nodo.
Cómo hacerlo exactamente depende del cliente que esté utilizando.
Por lo general, Redis usa el algoritmo XModem CRC 16 para determinar dónde está almacenada la clave, verifique este código fuente: https://github.com/h0x91b/fast-redis-cluster/blob/remake/index.js#L92:L175
Para saber dónde está realmente almacenada la clave, debe calcular xmodem crc16 del nombre de la clave, luego tomar el módulo de 16384. El resultado es el bucket number de depósito, ahora puede usar el comando CLUSTER NODES para determinar qué servidor sirve este depósito.
Por ejemplo, nuestro nombre clave es 123456789
crc16 de 123456789 es 12739
12739 % 16384 = 12739, por lo que nuestro balde es 12739
Luego ejecute el comando CLUSTER NODES , sin importar en qué servidor maestro/esclavo.
Verás algo como esto:
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 Cada línea es un servidor. 2339fe27bd311835712965a764839b4acaf41d5c es la identificación del servidor, luego la dirección IP y el puerto, las banderas y la configuración.
Necesitamos encontrar la línea que contiene flag master y al final de esta línea verá qué depósitos aloja este servidor.
En mi caso, la línea necesaria es:
b43c92c05670537a60bcbf5430fef5e66ddebbcf 127.0.0.1:7002@17002 master - 0 1493302249900 1 connected 8192-16382
8192-16382 <<< este servidor sirve cubos 8192,8193,8194...16382 (inclusive) por lo que nuestra clave se encuentra en el servidor 127.0.0.1:7002
Solo hay dos sintaxis para depósitos.
Una cosa más, redis admite Hashtags en modo clúster, si la clave se parece a hello{world} crc16, solo lo hacemos en 'hello' sin '{world}' crc16('hello') esto puede ayudarlo a almacenar las claves en el mismo instancia..
La combinación de node-redis y node-redis-streamify me da el resultado que esperaba...
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 ***'); });