Pregunta ¿Hay un MGET analógico para los hashes de Redis?


Estoy planeando comenzar a utilizar hashes insead de claves regulares. Pero no puedo encontrar ninguna información acerca de obtener múltiples para hash-keys en la wiki de Redis. ¿Este tipo de comando es compatible con Redis?

Gracias.


32
2017-07-25 13:50


origen


Respuestas:


Puede consultar hash o cualquier clave en pipeline, es decir, en una solicitud a su instancia de redis. La implementación real depende de su cliente, pero con redis-py se vería así:

pipe = conn.pipeline()
pipe.hgetall('foo')
pipe.hgetall('bar')
pipe.hgetall('zar')
hash1, hash2, hash3 = pipe.execute()

El cliente emitirá una solicitud con 3 comandos. Esta es la misma técnica que se usa para agregar múltiples valores a un conjunto a la vez.

Lee mas en http://redis.io/topics/pipelining


33
2018-02-08 00:42



Si SORT le permite usar múltiples GET con la sintaxis ->, y todos sus hashes tienen los mismos campos, puede obtenerlos en una respuesta masiva colocando sus nombres en un conjunto y clasificándolo.

  SORT names_of_hashes GET *->field1 *->field2 *->field3 *->etc

Pero no parece que puedas hacer eso con el acceso al hash. Además, deberías convertir la lista de devoluciones en hashes tú mismo.

ACTUALIZACIÓN: Redis parece permitirle buscar múltiples campos si nombra sus hashes muy bien:

redis> hset hash:1 name fish
(integer) 1
redis> hset hash:2 name donkey
(integer) 1
redis> hset hash:3 name horse
(integer) 1
redis> hset hash:1 type fish
(integer) 1
redis> hset hash:2 type mammal
(integer) 1
redis> hset hash:3 type mammal
(integer) 1
redis> sadd animals 1
(integer) 1
redis> sadd animals 2
(integer) 1
redis> sadd animals 3
(integer) 1
redis> sort animals get # get hash:*->name get hash:*->type
1. "1"
2. "fish"
3. "fish"
4. "2"
5. "donkey"
6. "mammal"
7. "3"
8. "horse"
9. "mammal"

6
2017-12-03 14:14



No MHGETALL pero puedes Lua:

local r = {}
for _, v in pairs(KEYS) do
  r[#r+1] = redis.call('HGETALL', v)
end

return r

4
2018-03-11 10:14



Redis tiene un HMGET comando, que devuelve los valores de varias teclas hash con un comando.


2
2017-08-09 21:57



No hay ningún comando para hacerlo de una sola vez, pero hay una manera de hacerlo "muy bien", usando una lista (o un conjunto ordenado) donde almacenaría hashKeys, y luego recuperarlos como un volumen utilizando multi.

En PHP:

$redis->zAdd("myHashzSet", 1, "myHashKey:1");
$redis->zAdd("myHashzSet", 2, "myHashKey:2");
$redis->zAdd("myHashzSet", 3, "myHashKey:3");

$members = $redis->zRange("myHashzSet", 0, -1);
$redis->multi();
foreach($members as $hashKey) {
    $redis->hGetAll($hashKey);
}
$results = $redis->exec();

Recomiendo usar un conjunto ordenado, donde usa el puntaje como una identificación para su hash, permite aprovechar todas las puntuaciones basadas en el comando.


0
2018-01-19 17:39