2013-10-09 17 views
8

Tentativo di definire un criterio per le chiavi in ​​un archivio di valori-chiave (stiamo usando Redis). Lo spazio delle chiavi dovrebbe essere:Qual è un buon modo per gestire le chiavi in ​​un archivio di valori-chiave?

  • Shardable (può introdurre più server e diffondere lo spazio delle chiavi tra loro)

  • namespace (ci dovrebbe essere qualche meccanismo per i tasti "gruppo" insieme logicamente, ad esempio per dominio o concetti associati)

  • Efficiente (cercare di utilizzare il minimo spazio possibile nel DB per le chiavi, per consentire il maggior numero di dati una possibile)

  • Come collisione meno possibile (evitando chiavi per due oggetti differenti sono uguali)


due alternative che ho considerato sono queste:

  1. Utilizzare i prefissi per gli spazi dei nomi, separati da un carattere (come human_resources:person:<some_id>). L'aspetto positivo di questo è che è abbastanza scalabile e facile da capire. Lo svantaggio sarebbe possibili conflitti a seconda del separatore (cosa succede se id ha il carattere : in esso?), Ed eventualmente l'efficienza della dimensione (troppi spazi dei nomi nidificati potrebbero creare tasti molto lunghi).

  2. Utilizzare una struttura di dati (come Set ordinato o Hash) per memorizzare gli spazi dei nomi. Lo svantaggio principale di questo sarebbe la perdita di "shardability", dal momento che la struttura per memorizzare gli spazi dei nomi avrebbe bisogno di essere in un unico database.

Domanda: Quale potrebbe essere un buon modo per gestire uno spazio delle chiavi in ​​una configurazione sharded? Dovremmo usare una di queste alternative, o c'è qualche altro schema migliore che non abbiamo considerato?

Grazie mille!

risposta

8

La convenzione generalmente accettata nel mondo Redis è l'opzione 1, ovvero spazi dei nomi separati da un carattere come i due punti. Detto questo, gli spazi dei nomi sono quasi sempre ad un livello profondo. Ad esempio: person:12321 anziché human_resources:person:12321.

Come funziona con le 4 linee guida impostate?

Shardable - Questo approccio è condivisibile. Ogni chiave può entrare in un frammento diverso o lo stesso frammento a seconda di come lo si imposta.

Namespace Lo spazio dei nomi come metodo per evitare le collisioni funziona con questo approccio. Tuttavia, lo spazio dei nomi come metodo per raggruppare le chiavi non funziona. In generale, utilizzare le chiavi come metodo per raggruppare i dati è una cattiva idea. Ad esempio, cosa succede se la persona si sposta da un dipartimento all'altro? Se cambi la chiave, dovrai aggiornare tutti i riferimenti - e questo diventa complicato.

È consigliabile assicurarsi che la chiave non cambi mai per un oggetto.Il raggruppamento può quindi essere gestito esternamente creando un indice separato.

Ad esempio, diciamo che si desidera raggruppare le persone per reparto, per intervallo di stipendio, per posizione. Ecco come lo faresti -

  1. persone individuali vanno in hash separato con chiavi persons:12321
  2. Creare un set per ogni gruppo da - Ad esempio: persons_by:department - e memorizzare solo gli identificatori numerici per ogni persona in questo impostato. Ad esempio [12321, 43432]. In questo modo, si ottiene i vantaggi di Integer Set Redis'

efficiente Il metodo descritto sopra è la memoria piuttosto efficace saggio. Per risparmiare un po 'di memoria, è possibile comprimere ulteriormente i tasti sul lato dell'applicazione. Ad esempio, è possibile memorizzare p:12321 anziché persons:12321. Dovresti farlo solo se hai determinato tramite il profilo che hai bisogno di risparmi di memoria. In generale, non ne vale la pena.

Collisione gratuita Dipende dall'applicazione. Ogni utente o persona dovrebbe avere una chiave primaria che non cambia mai. Usa questo nella tua chiave Redis e non avrai collisioni.

Lei ha parlato di due problemi con questo approccio, e cercherò di affrontarli

Che cosa succede se l'id ha un colon?

Ovviamente è possibile, ma il design dell'applicazione deve impedirlo. È meglio non consentire caratteri speciali negli identificatori, perché verranno utilizzati su più sistemi. Ad esempio, l'identificatore sarà molto probabilmente una parte dell'URL e colon è un carattere riservato anche per gli URL.

Se davvero devi consentire caratteri speciali nel tuo identificatore, dovresti scrivere un piccolo wrapper nel codice che codifica i caratteri speciali. La codifica dell'URL è perfettamente in grado di gestirlo.

Dimensioni Efficienza

C'è un costo per chiavi lunghe, ma non è troppo. In generale, dovresti preoccuparti della dimensione dei dati dei tuoi valori piuttosto che delle chiavi. Se pensi che le chiavi stiano consumando troppa memoria, profila il database usando uno strumento come redis-rdb-tools.

Se si determina che la dimensione della chiave è un problema e si desidera salvare la memoria, è possibile scrivere un piccolo wrapper che riscriva le chiavi utilizzando un alias.

+0

Risposta meravigliosa. Grazie mille per aver dedicato del tempo e affrontato questo problema. Mi scuso per non aver cliccato prima sul pulsante "Bounty", ma questa è la prima volta che lo uso. Grazie! –

Problemi correlati