Quiero usar operaciones de varias claves en un clúster de diseño propio de Amazon ElastiCache (Redis OSS) con el modo de clúster activado. Sin embargo, recibo el error «CROSSSLOT Keys in request don’t hash to the same slot».
Descripción corta
Aparece el siguiente error cuando las claves no están en la misma ranura de hash, aunque estén almacenadas en el mismo nodo:
«CROSSSLOT Keys in request don't hash to the same slot»
Para implementar operaciones con varias claves en un clúster de ElastiCache (Redis OSS) con particiones con el modo de clúster activado, haz un hash de las claves en la misma ranura de hash.
En los siguientes conjuntos de ejemplos, «myset2» y «myset» están en el mismo nodo:
172.31.62.135:6379> scan 0
1) "0"
2) 1) "myset"
2) "myset2"
Sin embargo, no se admite una operación con varias claves:
172.31.62.135:6379> SUNION myset myset2(error) CROSSSLOT Keys in request don't hash to the same slot
Esta operación no se admite porque las claves no están en la misma ranura de hash. Los dos conjuntos se encuentran en dos ranuras diferentes, 560 y 7967:
172.31.62.135:6379> CLUSTER KEYSLOT myset(integer) 560
172.31.62.135:6379> CLUSTER KEYSLOT myset2(integer) 7967
Resolución
Método 1
Puedes usar una biblioteca cliente de Redis que brinde soporte para clústeres de Redis con el modo de clúster activado. Para obtener más información, consulta Especificación del clúster de Redis en el sitio web de Redis.
El siguiente ejemplo usa redis-cli para obtener claves de ranuras ubicadas en diferentes particiones. Esto produce un error CROSSSLOT:
redis-cli -c -h RedisclusterCfgEndpointRedisclusterCfgEndpoint:6379> mget key1 key2
(error) CROSSSLOT Keys in request don't hash to the same slot
Cuando usas redis-py-cluster para obtener claves de ranuras ubicadas en diferentes particiones, recibes el resultado correcto:
>>> from rediscluster import RedisCluster>>> startup_nodes = [{"host": "RedisclusterCfgEndpoint", "port": "6379"}]
>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True,skip_full_coverage_check=True)
>>> print(rc.mget("key1","key2"))
Método 2
Cuando crees claves para operaciones con varias claves en un clúster que tiene activado el modo de clúster, coloca las claves en la misma ranura de hash. Puedes usar hashtags para meter las claves en la misma ranura de hash. Cuando la clave contiene un patrón {...}, solo la subcadena entre corchetes, { y }, se convierte en hash para calcular la ranura de hash.
El siguiente es un ejemplo de varios conjuntos que se cifran en la misma ranura de hash. Las claves {user1}:myset y {user1}:myset2 se cifran en la misma ranura de hash. Solo se usa user1 para calcular la ranura de hash.
172.31.62.135:6379> CLUSTER KEYSLOT {user1}:myset(integer) 8106
172.31.62.135:6379> CLUSTER KEYSLOT {user1}:myset2
(integer) 8106
172.31.62.135:6379> SUNION {user1}:myset {user1}:myset2
1) "some data for myset"
2) "some data for myset2"
Después de aplicar el hash a ambos conjuntos en la misma ranura de hash, puedes realizar una operación con varias claves.