Pourquoi l'erreur « CROSSSLOT Keys in request don't hash to the same slot » (Les clés CROSSLOT ne sont pas hachées dans le même emplacement) s'affiche-t-elle lorsque j'exécute des opérations multiclés sur un cluster ElastiCache (mode Cluster activé) Redis ?

Date de la dernière mise à jour : 13/02/2020

Pourquoi l'erreur « CROSSSLOT Keys in request don't hash to the same slot » (Les clés CROSSLOT ne sont pas hachées dans le même emplacement) s'affiche-t-elle lorsque j'exécute des opérations multiclés sur un cluster Amazon ElastiCache for Redis (mode cluster activé), même si les clés sont stockées sur le même nœud ?

Brève description

Cette erreur se produit parce que les clés doivent se trouver dans le même emplacement de hachage et pas simplement dans le même nœud. Pour implémenter des opérations multiclés dans un cluster ElastiCache Redis (mode Cluster activé), les clés doivent être hachées dans le même emplacement de hachage. Vous pouvez forcer les clés dans le même emplacement de hachage en utilisant des balises de hachage.

Dans cet exemple, les jeux "myset2" et "myset", se trouvent dans le même nœud :

172.31.62.135:6379> scan 0
1) "0"
2)  1) "myset"
    2) "myset2"

Cependant, une opération multiclé n'est pas prise en charge :

172.31.62.135:6379> SUNION myset myset2
(error) CROSSSLOT Keys in request don't hash to the same slot

En effet, les clés ne se trouvent pas dans le même emplacement de hachage. Dans cet exemple, les deux jeux se trouvent dans deux emplacements différents, 560 et 7967 :

172.31.62.135:6379> CLUSTER KEYSLOT myset
(integer) 560
172.31.62.135:6379> CLUSTER KEYSLOT myset2
(integer) 7967

Solution

Méthode 1

Vous pouvez utiliser une bibliothèque client Redis qui prend en charge les clusters Redis (mode cluster activé). Pour plus d'informations sur les clusters Redis, consultez le site Web redis-py-cluster.

Par exemple, l'utilisation de redis-cli renvoie l'erreur CROSSSLOT lorsqu'elle est utilisée pour obtenir des clés à partir d'emplacements situés dans différentes partitions :

redis-cli -c -h RedisclusterCfgEndpoint
RedisclusterCfgEndpoint:6379> mget key1 key2
(error) CROSSSLOT Keys in request don't hash to the same slot

L'utilisation du redis-py-cluster pour obtenir des clés à partir d'emplacements situés dans différentes partitions renvoie la sortie correcte :

>>> 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éthode 2

Lors de la création de clés utilisées par les opérations à plusieurs clés sur un cluster activé pour le mode cluster, utilisez des hashtags pour forcer les clés dans le même emplacement de hachage. Lorsque la clé contient un modèle "{...}", seule la sous-chaîne entre les accolades, "{" et "}" est hachée afin d'obtenir l'emplacement de hachage.

Par exemple, les clés {user1}:myset et {user1}:myset2 sont hachées dans le même emplacement de hachage, car seule la chaîne entre les accolades "{" et "}", à savoir "user1", est utilisée pour calculer l'emplacement de hachage.

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"

Maintenant que les deux jeux sont hachés dans le même emplacement de hachage, vous pouvez effectuer une opération multiclé.


Cette page vous a-t-elle été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?