Vous pouvez, mais ce n'est pas anodin. Tout d'abord, Redis utilise des accolades dans la clé pour déterminer la partie partitionnement de celle-ci, vous pouvez donc décider de modifier une clé et de l'envoyer à une partition arbitraire.
Maintenant, vous avez besoin de deux choses :
-
Une carte indiquant quelle partition ou plage d'emplacements réside dans quelle instance redis.
-
Un moyen de savoir quelle chaîne correspond à quel emplacement, de sorte que vous pouvez forcer une "chaîne de partitionnement" sur votre clé pour l'acheminer vers une partition spécifique.
Le premier est facile - CLUSTER SLOTS
vous donnera cette carte, il suffit de l'analyser.
Le second est plus délicat - mais heureusement, j'ai déjà fait ce travail. J'ai créé une table du mappage de chaîne alphanumérique le plus court possible à chacun des 16384 emplacements du cluster Redis. C'est en C mais vous pouvez facilement le convertir en n'importe quoi. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
Donc, votre algorithme serait, étant donné une clé et un nœud souhaité :
-
Regardez la carte des emplacements et prenez les plages d'emplacements qui résident sur ce nœud.
-
Sélectionnez un emplacement dans la plage de ce nœud.
-
Regardez dans la table de partitionnement pour l'entrée de cet emplacement.
-
Frappez cette chaîne avec des accolades sur la clé. par exemple. convertir
foo
àfoo{e4x}
.
Et c'est tout! Toute commande utilisant cette clé sera acheminée vers ce fragment.
Version pseudo-python :
# Build this table from CLUSTER SLOTS or CLUSTER NODES
slots = {
'127.0.0.1:7000': [(0, 1045),(2000,2100)]
...
}
# Build this table from the C example:
sharding_table = ["06S", "Qi", "5L5", "4Iu", "4gY", ....]
def retarget_key(key, node):
ranges = slots[node]
sharding_key = shading_table[ranges[0][0]]
return '%s{%s}' % (key, sharding_key)