Redis
 sql >> Base de données >  >> NoSQL >> Redis

Existe-t-il un moyen de localiser une clé spécifique sur une instance Redis spécifique en mode cluster ?

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 :

  1. Une carte indiquant quelle partition ou plage d'emplacements réside dans quelle instance redis.

  2. 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é :

  1. Regardez la carte des emplacements et prenez les plages d'emplacements qui résident sur ce nœud.

  2. Sélectionnez un emplacement dans la plage de ce nœud.

  3. Regardez dans la table de partitionnement pour l'entrée de cet emplacement.

  4. 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)