2010-07-25 8 views
29

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?¿Hay un MGET analógico para los hashes de Redis?

Gracias.

+0

Si su pregunta ha sido contestada, por favor marque la respuesta correcta. Gracias. – kmerenkov

Respuesta

31

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() 

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.

Ver más en http://redis.io/topics/pipelining

2

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

+1

Sí, pero HMGET devolverá múltiples valores de campos concretos, pero necesito devolver hashes completos (como HGETALL hacer http://code.google.com/p/redis/wiki/HgetallCommand). De todos modos, gracias por tu respuesta. – Kirzilla

+1

Bump! ¿Qué quieres decir con hashes completos? Con 'HMGET' tienes todos los valores para las claves consultadas, y como ya tienes las claves, y cada clave tiene un valor correspondiente en orden, puedes construir un hash local con cada par clave/valor en tu código. Por favor explique. Gracias. – Niloct

+4

Si un hash se usa conceptualmente para contener a un usuario, entonces HMGET le proporcionará, por ejemplo, el nombre de usuario y la contraseña del usuario único con la ID especificada. Un método equivalente análogo al de MGET para hash daría, dado un conjunto de ID, los nombres de usuario y las contraseñas de todos esos usuarios, todo de una vez. Esa es la diferencia. – majelbstoat

6

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 se pueda hacer eso con el acceso al hash. Además, deberías convertir la lista de devoluciones en hashes tú mismo.

ACTUALIZACIÓN: Redis parece dejar de hacer salir varios campos si el nombre de sus valores hash 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" 
0

No hay un comando que hacerlo en una sola toma, pero hay una manera de hacerlo "muy bien" , usando una lista (o un conjunto ordenado) donde almacenaría hashKeys, y luego los recupera como un todo usando 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 el uso de un conjunto ordenado, en el que utiliza la partitura como un identificador para el hachís, que permite aprovechar las ventajas de todos los comandos puntuación basada.

3

Sin MHGETALL pero puede que LUA:

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

return r