Můžete, ale není to triviální. Za prvé, Redis používá složené závorky v klíči k určení jeho části shardingu, takže se můžete rozhodnout upravit klíč a poslat ho na libovolný fragment.
Nyní potřebujete dvě věci:
-
Mapa toho, jaký fragment nebo rozsah slotů se nachází v které instanci redis.
-
Způsob, jak zjistit, který řetězec se mapuje do kterého slotu, takže můžete vynutit "sharding string" na klíči, aby jej směroval do konkrétního fragmentu.
První je snadný - CLUSTER SLOTS
dá vám tu mapu, stačí ji analyzovat.
Druhý je složitější - ale naštěstí jsem to už udělal. Vytvořil jsem tabulku nejkratšího možného mapování alfanumerických řetězců na každý z 16384 slotů v clusteru Redis. Nejsem v C, ale můžete to snadno převést na cokoliv. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
Váš algoritmus by tedy měl mít klíč a požadovaný uzel:
-
Podívejte se na mapu slotů a vezměte si rozsahy slotů, které se nacházejí v tomto uzlu.
-
Vyberte slot v rozsahu tohoto uzlu.
-
Hledejte v tabulce shardingu záznam tohoto slotu.
-
Přiklepněte ten provázek složenými závorkami na klíč. např. převést
foo
dofoo{e4x}
.
A to je vše! Jakýkoli příkaz používající tento klíč bude směrován na daný fragment.
Pseudo-python verze:
# 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)