Je souhaite utiliser des opérations à clés multiples sur un cluster Amazon ElastiCache (Redis OSS) conçu par mes soins avec le mode cluster activé. Toutefois, je reçois l’erreur « CROSSSLOT Keys in request don't hash to the same slot » (Les clés CROSSSLOT demandées ne sont pas hachées dans le même emplacement)
Brève description
L'erreur suivante s'affiche lorsque vos clés ne se trouvent pas dans le même emplacement de hachage, même si elles sont stockées dans le même nœud :
« CROSSSLOT Keys in request don't hash to the same slot » (Les clés CROSSSLOT demandées ne sont pas hachées dans le même emplacement)
Pour implémenter des opérations à clés multiples dans un cluster ElastiCache (Redis OSS) partitionné avec le mode cluster activé, hachez les clés dans le même emplacement de hachage.
Dans les ensembles d'exemples suivants, « 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"
Mais une opération à clés multiples 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
Cette opération n'est pas prise en charge car les clés ne se trouvent pas dans le même emplacement de hachage. Les deux ensembles 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
Résolution
Méthode 1
Vous pouvez utiliser une bibliothèque cliente Redis qui prend en charge les clusters Redis lorsque le mode cluster est activé. Pour plus d'informations, consultez la page Spécification du cluster Redis sur le site Web de Redis.
L'exemple suivant utilise redis-cli pour récupérer les clés des emplacements situés dans différents partitions. Une erreur CROSSSLOT est alors générée :
redis-cli -c -h RedisclusterCfgEndpointRedisclusterCfgEndpoint:6379> mget key1 key2
(error) CROSSSLOT Keys in request don't hash to the same slot
Lorsque vous utilisez le cluster redis-py-cluster pour récupérer des clés à partir d'emplacements situés dans différentes partitions, vous recevez 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
Lorsque vous créez des clés pour des opérations à clés multiples sur un cluster dont le mode cluster est activé, forcez les clés à entrer dans le même emplacement de hachage. Vous pouvez utiliser 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 accolades, { et }, est hachée pour calculer l'emplacement de hachage.
Voici un exemple de plusieurs ensembles hachés dans le même emplacement de hachage. Les clés {user1}:myset et {user1}:myset2 sont hachées dans le même emplacement de hachage. Seul user1 est utilisé 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"
Une fois que vous avez haché les deux ensembles dans le même emplacement de hachage, vous pouvez effectuer une opération à clés multiples.