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:
-
Eine Karte, welcher Shard oder Slot-Bereich sich in welcher Redis-Instanz befindet.
-
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:
-
Sehen Sie sich die Steckplatzkarte an und nehmen Sie die Steckplatzbereiche, die sich auf diesem Knoten befinden.
-
Wählen Sie einen Steckplatz innerhalb der Reichweite dieses Knotens aus.
-
Suchen Sie in der Sharding-Tabelle nach dem Eintrag dieses Slots.
-
Schlagen Sie diese Saite mit geschweiften Klammern auf die Taste. z.B. konvertieren Sie
foo
anfoo{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)