La lunghezza del nome influisce sulle prestazioni in Redis?


129

Mi piace usare nomi dettagliati in Redis, per esempio set-allBooksBelongToUser:$userId.

Va bene o influisce sulle prestazioni?

Risposte:


198

La chiave di cui stai parlando non è poi così lunga.

La chiave di esempio fornita è per un set, i metodi di ricerca set sono O (1). Le operazioni più complesse su un set (SDIFF, SUNION, SINTER) sono O (N). Le probabilità sono che popolando$userId sia un'operazione più costosa rispetto all'utilizzo di una chiave più lunga.

Redis viene fornito con un'utilità di benchmark chiamata redis-benchmark, se si modifica il test "GET" in src / redis-benchmark.c in modo che la loro chiave sia solo "pippo", è possibile eseguire il test della chiave breve dopo un make install:

diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
         benchmark("MSET (10 keys)",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"SET foo:rand:000000000000 %s",data);
+        len = redisFormatCommand(&cmd,"SET foo %s",data);
         benchmark("SET",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"GET foo:rand:000000000000");
+        len = redisFormatCommand(&cmd,"GET foo");
         benchmark("GET",cmd,len);
         free(cmd);

Ecco la velocità del test GET per 3 corse successive del tasto corto "pippo":

59880.24 requests per second
58139.53 requests per second
58479.53 requests per second

Ecco la velocità del test GET dopo aver modificato nuovamente la sorgente e aver cambiato la chiave in "set-allBooksBelongToUser: 1234567890":

60240.96 requests per second
60606.06 requests per second
58479.53 requests per second

Cambiare la chiave ancora una volta a "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem: 1234567890" conferisce a questo:

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second

Quindi anche i tasti davvero molto lunghi non hanno un grande impatto sulla velocità del redis. E questo è su GET, un'operazione O (1). Operazioni più complesse sarebbero ancora meno sensibili a questo.

Penso che avere chiavi che identificano chiaramente quali valori detengono superi di gran lunga le prestazioni minime della velocità che otterresti dalle chiavi abbreviate.

Se volessi andare oltre, c'è anche un -r [keyspacelen]parametro nell'utilità redis-benchmark che consente di creare chiavi casuali (purché abbiano ': rand:' in esse), potresti semplicemente aumentare la dimensione del prefisso nel testare il codice per la lunghezza desiderata.


6
che dire di quanto spazio occupa? se ho 1 milione di questi tasti davvero lunghi sarà molto più grande in memoria o persistente su disco?
Derek Organ,

9
@Derek Organ sì, avrebbe sicuramente un impatto sulla memoria occupata, quindi se le tue chiavi sono una parte significativa di ciò che stai archiviando e stai correndo in limiti di memoria, potresti voler essere meno prolisso. Penso che sia necessario bilanciare l'usabilità con considerazioni di spazio. Il tempo di ricerca complessivo non è significativamente più lungo con i tasti, ma lo spazio occupato sarebbe.
Ted Naleid,

Solitamente utilizziamo le lunghezze di chiave più brevi possibili e spostiamo la "leggibilità" sui nostri oggetti di dominio e sui loro metodi. Usiamo anche brevi spazi dei nomi nelle nostre chiavi per aiutare direttamente con la manutenzione e l'ispezione in redis.
xentek,

26

A Redis piace tenere tutti i tasti in memoria. Maggiore è la lunghezza media della chiave, minore è la capacità di memorizzazione. Quindi sì, la lunghezza della chiave può influire notevolmente sulle prestazioni, ma probabilmente non significativamente per quanto ti riguarda. Cioè, con un piccolo spazio per i tasti (ad esempio uno che si adatta facilmente alla memoria), una chiave da 128 byte e una chiave da 16 byte non funzioneranno in modo drammatico in modo diverso.


4
Redis è per definizione un archivio all-in-memory, quindi la prima frase è sconcertante per me.
Lee Grissom,

5
@bmatheny, se capisco correttamente la tua query, Redis è fondamentalmente un archivio in memoria e supporta anche la persistenza
Najeeb

5

Non posso rispondere a questa domanda con certezza. Tuttavia, posso fare alcune domande al riguardo e offrire alcune osservazioni.

Penso che sia ovvio che chiavi (nomi) e / o valori estremamente lunghi avrebbero un impatto sulle prestazioni complessive se fossero utilizzabili. Questi impatti potrebbero essere sul client, sulla rete o sul server. Quindi la prima domanda da trascinare fuori dalla tua sarebbe:

Quanto possono durare le chiavi e i valori tra Redis e i tuoi clienti?

La ricerca su Redis , la lunghezza e i limiti della chiave mi dà un interessante post sul blog su Redis vs. memcached che potrebbe iniziare a rispondere alla tua domanda. La prima risposta a quel post sul blog sembra essere stata scritta da Salvatore Sanfilipo, creatore di Redis (all'inizio dello scorso autunno: 09/2010), suggerendo che una versione più recente avrebbe mostrato risultati significativamente migliori. Due commenti qui sotto ci collegano al Redis di Salvatore / Memcached Benchmark che è stato pubblicato pochi giorni dopo aver risposto al "blagger" originale (che sembra essere anonimo).

Questo non risponde alle domande (quanto possono essere lunghe le chiavi e in quali punti ci sono impatti rilevabili sulle prestazioni). Tuttavia, ci dà un indizio sull'approccio alla domanda.

Gli autori di entrambi questi articoli hanno scritto il codice e lo hanno testato ... e hanno rappresentato graficamente i risultati.

Potremmo fare ogni sorta di ipotesi. Potremmo guardare il codice e provare a ragionarlo.

Tuttavia, il modo più significativo per affrontare una domanda di questo tipo è scrivere del codice per misurare un modello di utilizzo proposto ... e alcuni altri per testarne un altro (ad esempio un intervallo di lunghezze di chiave che vanno da 8 caratteri a ... come a lungo vorresti ... 8 kilobyte?) ... e misuralo.


-7

Non credo che la lunghezza del nome della variabile influirà sulle prestazioni, la variabile avrà lo stesso posto di qualsiasi variabile prenderà per quel tipo di dati nella misura in cui non stai superando la lunghezza massima del nome.


6
Charlie: queste non sono realmente "variabili", sono chiavi. Per i tasti tra 1 e 30 o 100, o anche 255 caratteri, potrebbe non esserci alcun impatto sulle prestazioni rilevabile. Crea chiavi di alcuni kilobyte ... o fino a decine di kilobyte e immagino che saresti in grado di misurare un hit di prestazione (a un certo punto tra 1K e 70K, otterrai un overhead di rete aggiuntivo poiché le dimensioni della chiave superare l'MTU e i dati dovranno essere suddivisi su più pacchetti ... sostenendo almeno il TCP e il riassemblaggio delle spese generali).
Jim Dennis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.