Redis
 sql >> база данни >  >> NoSQL >> Redis

Има ли начин да се направи локализиране на специфичен ключ в конкретен екземпляр за преразглеждане в режим на клъстер?

Можеш, но не е тривиално. На първо място, Redis използва къдрави скоби в ключа, за да определи частта му за разделяне, така че можете да решите да промените ключ и да го изпратите на произволен фрагмент.

Сега имате нужда от две неща:

  1. Карта на това какъв сегмент или диапазон на слот се намира в кой екземпляр на redis.

  2. Начин да разберете кой низ съответства на кой слот, така че можете да принудите „низ за разделяне“ на вашия ключ, за да го насочите към конкретен фрагмент.

Първият е лесен - CLUSTER SLOTS ще ви даде тази карта, просто я анализирайте.

Вторият е по-сложен - но за щастие вече свърших тази работа. Създадох таблица с възможно най-краткото съпоставяне на буквено-цифров низ към всеки от 16384 слота в Redis клъстер. Аз съм в C, но можете лесно да го конвертирате във каквото и да е. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

Така че вашият алгоритъм ще бъде, като му е даден ключ и желан възел:

  1. Погледнете картата на слотовете и вземете диапазоните на слотовете, които се намират на този възел.

  2. Изберете слот в обхвата на този възел.

  3. Погледнете в таблицата за разделяне за влизане на този слот.

  4. Плеснете този низ с къдрави скоби върху ключа. напр. конвертирайте 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)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ruby - Redis базиран мютекс с изпълнение на изтичане

  2. Мога ли да задам глобален TTL в redis?

  3. Преброяване на потребителите на socket.io в хоризонтални сървъри

  4. Redis:Неуспешно отваряне на .rdb за запазване:Разрешението е отказано

  5. Какъв е смисълът на REDIS в стека ELK?