Du kan, men det är inte trivialt. Först och främst använder Redis lockiga hängslen i nyckeln för att bestämma skärningsdelen av den, så du kan bestämma dig för att modifiera en nyckel och skicka den till en godtycklig skärva.
Nu behöver du två saker:
-
En karta över vilken shard eller slot-range som finns i vilken redis-instans.
-
Ett sätt att veta vilken sträng som mappas till vilken plats, så att du kan tvinga en "skärningssträng" på din nyckel för att dirigera den till en specifik skärva.
Den första är enkel - CLUSTER SLOTS
kommer att ge dig den kartan, bara analysera den.
Den andra är mer knepig - men som tur är har jag redan gjort det här arbetet. Jag har skapat en tabell över den kortaste möjliga alfanumeriska strängmappningen till var och en av de 16384 platserna i Redis-klustret. Jag är inte i C men du kan enkelt konvertera det till vad som helst. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
Så din algoritm skulle vara, givet en nyckel och en önskad nod:
-
Titta på kortplatskartan och ta platsområdena som finns på den noden.
-
Välj en plats inom den nodens räckvidd.
-
Titta i sönderdelningstabellen för inträde i den luckan.
-
Slå det snöret med lockiga hängslen på nyckeln. t.ex. konvertera
foo
tillfoo{e4x}
.
Och det är allt! Alla kommandon som använder den här nyckeln kommer att dirigeras till den skärvan.
Pseudo-python-version av det:
# 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)