Możesz, ale to nie jest trywialne. Przede wszystkim Redis używa nawiasów klamrowych w kluczu, aby określić jego część na fragmenty, więc możesz zdecydować się na zmodyfikowanie klucza i wysłanie go do dowolnego fragmentu.
Teraz potrzebujesz dwóch rzeczy:
-
Mapa tego, jaki fragment lub zakres slotów znajduje się w której instancji redis.
-
Sposób na sprawdzenie, który ciąg jest mapowany do którego gniazda, dzięki czemu można wymusić „ciąg fragmentujący” na kluczu, aby skierować go do określonego fragmentu.
Pierwszy z nich jest łatwy - CLUSTER SLOTS
da ci tę mapę, po prostu ją przeanalizuj.
Drugi jest trudniejszy - ale na szczęście już wykonałem tę pracę. Stworzyłem tabelę najkrótszego możliwego mapowania ciągów alfanumerycznych do każdego z 16384 gniazd w klastrze Redis. Jest w C, ale możesz go łatwo przekonwertować na cokolwiek. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
Twój algorytm będzie miał klucz i pożądany węzeł:
-
Spójrz na mapę slotów i weź zakresy slotów, które znajdują się w tym węźle.
-
Wybierz gniazdo w zakresie tego węzła.
-
Poszukaj w tabeli shardingu wpisu tego slotu.
-
Uderz ten sznurek nawiasami klamrowymi na kluczu. np. przekonwertuj
foo
dofoo{e4x}
.
I to wszystko! Każde polecenie używające tego klucza zostanie przekierowane do tego fragmentu.
Pseudo-pythonowa wersja tego:
# 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)