Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Gibt es eine Möglichkeit, einen bestimmten Schlüssel auf einer bestimmten Redis-Instanz im Clustermodus zu lokalisieren?

Sie können, aber es ist nicht trivial. Zunächst verwendet Redis geschweifte Klammern im Schlüssel, um den Sharding-Teil davon zu bestimmen, sodass Sie sich entscheiden können, einen Schlüssel zu ändern und an einen beliebigen Shard zu senden.

Jetzt brauchen Sie zwei Dinge:

  1. Eine Karte, welcher Shard oder Slot-Bereich sich in welcher Redis-Instanz befindet.

  2. Eine Möglichkeit zu wissen, welcher String welchem ​​Steckplatz zugeordnet ist, sodass Sie einen "Sharding-String" auf Ihrem Schlüssel erzwingen können, um ihn an einen bestimmten Shard weiterzuleiten.

Der erste ist einfach - CLUSTER SLOTS wird Ihnen diese Karte geben, parsen Sie sie einfach.

Der zweite ist kniffliger - aber zum Glück habe ich diese Arbeit schon gemacht. Ich habe eine Tabelle mit der kürzestmöglichen alphanumerischen Zeichenfolgenzuordnung zu jedem der 16384-Slots im Redis-Cluster erstellt. Es ist in C, aber Sie können es leicht in was auch immer konvertieren. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

Ihr Algorithmus wäre also, wenn Sie einen Schlüssel und einen gewünschten Knoten haben:

  1. Sehen Sie sich die Steckplatzkarte an und nehmen Sie die Steckplatzbereiche, die sich auf diesem Knoten befinden.

  2. Wählen Sie einen Steckplatz innerhalb der Reichweite dieses Knotens aus.

  3. Suchen Sie in der Sharding-Tabelle nach dem Eintrag dieses Slots.

  4. Schlagen Sie diese Saite mit geschweiften Klammern auf die Taste. z.B. konvertieren Sie foo an foo{e4x} .

Und das ist es! Jeder Befehl, der diesen Schlüssel verwendet, wird an diesen Shard weitergeleitet.

Pseudo-Python-Version davon:

# 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)