Du kan, men det er ikke trivielt. Først og fremmest bruger Redis krøllede klammeparenteser i nøglen til at bestemme den skærende del af den, så du kan beslutte at ændre en nøgle og sende den til et vilkårligt skær.
Nu skal du bruge to ting:
-
Et kort over, hvilken shard eller slot-range, der findes i hvilken redis-instans.
-
En måde at vide, hvilken streng, der er knyttet til hvilken slot, så du kan tvinge en "sharding-streng" på din nøgle til at dirigere den til et specifikt shard.
Den første er nem - CLUSTER SLOTS
vil give dig det kort, bare parse det.
Den anden er mere tricky - men heldigvis har jeg allerede gjort dette arbejde. Jeg har lavet en tabel over den kortest mulige alfanumeriske strengmapping til hver af de 16384 slots i Redis-klyngen. Jeg er ikke i C, men du kan nemt konvertere det til hvad som helst. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
Så din algoritme ville være, givet en nøgle og en ønsket node:
-
Kig på pladskortet, og tag pladsintervallerne, der ligger på den node.
-
Vælg et slot inden for den nodes rækkevidde.
-
Se i sønderdelingstabellen for at finde indgangen til det slot.
-
Slå den snor med krøllede seler på nøglen. for eksempel. konverter
foo
tilfoo{e4x}
.
Og det er det! Enhver kommando, der bruger denne nøgle, vil blive dirigeret til det shard.
Pseudo-python version af 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)