L'exécution d'opérations groupées telles que MSET ou MGET dans un environnement de cluster Redis présente une particularité cruciale. En effet, ces commandes peuvent échouer si les clés ciblées ne sont pas co-localisées sur le même slot de hachage, entraînant une erreur CROSSSLOT.
Comprendre l'erreur CROSSSLOT
Dans un cluster Redis, chaque clé est assignée à un slot spécifique (il y en a 16384). Les opérations groupées ne sont autorisées que si toutes les clés qu'elles manpiulent résident dans le même slot. Tenter d'exécuter une commande comme MSET sur des clés distribuées sur différents slots provoquera une erreur, comme illustré ci-dessous :
127.0.0.1:6379> mset cle1 valA cle2 valB cle3 valC
(error) CROSSSLOT Les clés de la requête ne hachent pas vers le même slot.
Mécanisme de Hachage des Clés dans Redis Cluster
Pour résoudre ce problème, il est essentiel de comprendre comment Redis Cluster détermine le slot d'une clé. La logique principale, telle que définie dans le code source de Redis (cluster.c), est la suivante :
- Clé sans accolades
{}: Si une clé ne contient pas les caractères{ou}, la totalité de la chaîne de la clé est utilisée pour calculer le hachage et assigner le slot. - Clé avec accolades mal formées ou vides : Si une clé contient un
{mais pas de}, ou si}est présent mais qu'aucun contenu n'est inséré entre{et}, la clé entière est également utilisée pour le hachage. - Clé avec un hash tag
{...}valide : Si une clé inclut un motif{...}avec du contenu à l'intérieur des accolades, seul le sous-ensemble de la clé situé entre ces accolades est extrait et utilisé pour le calcul du hachage. Ce mécanisme est appelé "hash tag".
C'est ce dernier point qui offre une solution élégante. En garantissant que la partie "hash tag" (le contenu entre { et }) est identique pour un ensemble de clés, Redis Cluster les assignera toutes au même slot, même si les clés complètes sont différentes.
Effectuer des Opérations Batch sur un Cluster Redis
Pour contourner la limitation CROSSSLOT et permettre les opérations par lot, il faut exploiter le mécanisme de hash tag. En incluant un identifiant commun entre accolades dans toutes les clés de l'opération groupée, vous forcez Redis à les co-localiser sur le même slot. Par exemple, si vous utilisez cle1{mon_groupe}, cle2{mon_groupe} et cle3{mon_groupe}, le cluster garantira que toutes ces clés sont gérées par le même nœud et le même slot, rendant les opérations groupées possibles.
Exemple d'opération MSET réussie
Voici comment exécuter une commande MSET avec des clés partageant le même hash tag :
127.0.0.1:6379> mset cle1{group1} valA cle2{group1} valB cle3{group1} valC
-> Redirection vers le slot [7859] situé à 192.168.145.133:6380
OK
Comme vous pouvez le voir, l'opération a été acceptée et redirigée vers le nœud responsable du slot 7859.
Récupération de valeurs
Il est important de noter que lorsque vous récupérez ces clés, vous devez utiliser leur nom complet, y compris le hash tag. Le hash tag fait partie intégrante du nom de la clé.
127.0.0.1:6379> get cle1{group1}
-> Redirection vers le slot [7859] situé à 192.168.145.133:6380
"valA"