Можеш, но не е тривиално. На първо място, Redis използва къдрави скоби в ключа, за да определи частта му за разделяне, така че можете да решите да промените ключ и да го изпратите на произволен фрагмент.
Сега имате нужда от две неща:
-
Карта на това какъв сегмент или диапазон на слот се намира в кой екземпляр на redis.
-
Начин да разберете кой низ съответства на кой слот, така че можете да принудите „низ за разделяне“ на вашия ключ, за да го насочите към конкретен фрагмент.
Първият е лесен - CLUSTER SLOTS
ще ви даде тази карта, просто я анализирайте.
Вторият е по-сложен - но за щастие вече свърших тази работа. Създадох таблица с възможно най-краткото съпоставяне на буквено-цифров низ към всеки от 16384 слота в Redis клъстер. Аз съм в C, но можете лесно да го конвертирате във каквото и да е. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
Така че вашият алгоритъм ще бъде, като му е даден ключ и желан възел:
-
Погледнете картата на слотовете и вземете диапазоните на слотовете, които се намират на този възел.
-
Изберете слот в обхвата на този възел.
-
Погледнете в таблицата за разделяне за влизане на този слот.
-
Плеснете този низ с къдрави скоби върху ключа. напр. конвертирайте
foo
къмfoo{e4x}
.
И това е! Всяка команда, използваща този ключ, ще бъде насочена към този фрагмент.
Псевдо-python версия на него:
# 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)