Explicación y uso de etiquetas de hash
Diseño de etiquetas de hash
Las operaciones de múltiples claves, como las que utilizan el comando MSET o los scripts de Lua, son atómicas. Todas las claves especificadas se ejecutan al mismo tiempo. Sin embargo, en un clúster, cada clave es hash a una partición dada, y las operaciones de múltiples claves ya no son atómicas. Las claves pueden asignarse a diferentes ranuras. Como resultado, algunas claves se actualizan, mientras que otras no. Si hay una etiqueta de hash, el clúster determina qué ranura asignar una clave basándose en la etiqueta de hash. Las claves con la misma etiqueta de hash se asignan a la misma ranura.
Uso de etiquetas de hash
Solo el contenido entre la primera llave de apertura ({) y la siguiente primera llave de cierre (}) es hash.
Por ejemplo:
- En las claves {user1000}.following y {user1000}.followers solo hay un par de llaves. user1000 se va a hash.
- En la clave foo{}{bar}, no hay contenido entre la primera { y la primera }. Toda la clave foo{}{bar} será hash como de costumbre.
- En la clave foo{{bar}}zap, {bar (el contenido entre la primera { y la primera }) es hash.
- En la clave foo{bar}{zap}, bar es hash porque está entre el primer par de { y }.
Ejemplo de etiqueta de hash
Cuando se realiza la siguiente operación:
EVAL "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2])" 2 key1 key2 value1 value2
Se muestra el siguiente error:
ERR 'key1' y 'key2' no están en la misma ranura
Puede usar una etiqueta de hash para resolver este problema:
EVAL "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2])" 2 {user}key1 {user}key2 value1 value2