Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Existe uma maneira de localizar uma chave específica em uma instância específica do redis no modo de cluster?


Você pode, mas não é trivial. Em primeiro lugar, o Redis usa chaves na chave para determinar a parte de fragmentação dela, para que você possa decidir modificar uma chave e enviá-la para um fragmento arbitrário.

Agora, você precisa de duas coisas:

  1. Um mapa de qual fragmento ou intervalo de slots reside em qual instância do redis.

  2. Uma maneira de saber qual string mapeia para qual slot, para que você possa forçar uma "string de fragmentação" em sua chave para roteá-la para um fragmento específico.

O primeiro é fácil - CLUSTER SLOTS lhe dará esse mapa, basta analisá-lo.

O segundo é mais complicado - mas felizmente eu já fiz esse trabalho. Criei uma tabela do mapeamento de string alfanumérico mais curto possível para cada um dos 16384 slots no cluster Redis. I'ts em C, mas você pode facilmente convertê-lo para o que for. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

Então, seu algoritmo seria, dado uma chave e um nó desejado:

  1. Observe o mapa de slots e pegue os intervalos de slots que residem nesse nó.

  2. Selecione um slot dentro do intervalo desse nó.

  3. Procure na tabela de fragmentação a entrada desse slot.

  4. Bata essa corda com chaves na chave. por exemplo. converter foo para foo{e4x} .

E é isso! Qualquer comando usando essa chave será roteado para esse estilhaço.

Versão pseudo-python dele:
# 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)