sql >> Database teknologi >  >> NoSQL >> Redis

Er der en måde at få en bestemt nøgle til at finde på en specifik redis-instans i klyngetilstand?

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:

  1. Et kort over, hvilken shard eller slot-range, der findes i hvilken redis-instans.

  2. 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:

  1. Kig på pladskortet, og tag pladsintervallerne, der ligger på den node.

  2. Vælg et slot inden for den nodes rækkevidde.

  3. Se i sønderdelingstabellen for at finde indgangen til det slot.

  4. Slå den snor med krøllede seler på nøglen. for eksempel. konverter foo til foo{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)



  1. Modulstik ikke fundet lua

  2. Hvad er standard session timeout, og hvordan man konfigurerer det, når du bruger Spring Session med Redis som backend

  3. Laravel :Redis Der kunne ikke oprettes forbindelse :[tcp://127.0.0.1:6379]

  4. Azure Redis-cache - timeouts på GET-opkald