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

Il modo migliore per archiviare le chiavi Redis

Tutto dipende da come lo utilizzerai. Se ogni byte conta, ad esempio quando devi pagare per ogni kB trasferito su un servizio cloud, puoi calcolare i costi. La matematica è semplice; un byte è un byte 'sul cavo'. All'interno di redis, per valori maggiori è altrettanto semplice. Per valori inferiori, Redis esegue un po' di ottimizzazione della memoria.

Nel tuo HSET ad esempio, dividi i membri, il che ha senso solo se hai bisogno che siano separati l'uno dall'altro per la maggior parte del tempo. Un approccio migliore -potrebbe- be:HSET user:data 987654321 '{"loc": "123456", "time": "2014-01-01T13:00:00"}' . Chiavi/membri separati "costano" molto di più delle stringhe più lunghe, dal punto di vista delle prestazioni. Puoi persino inserire un'intera tabella o un set di dati in un membro se verrà utilizzato solo come un'entità semistatica completa.

Velocità e dimensioni:c'è una notevole differenza tra i tasti e valori .

Chiavi: Più breve è generalmente più efficiente in termini di memoria e velocità. Se usi un set ordinato redis puoi anche usare i "numeri" come chiavi (set ordinato "membri" più "punteggi"). Dico "numeri" perché un punteggio è tecnicamente un float64, ma per essere utilizzato come ID deve essere compreso tra -99999999999999999 e 9999999999999999 inclusi (sono 15 cifre), senza alcuna parte frazionaria. Questo può essere davvero utile, dal momento che Redis esegue l'ordinamento al volo O(log(n)) veloce e scalabile degli insiemi ordinati (usando le skiplist, semplificato).

Valori: Il formato MsgPack (non compresso) occupa meno spazio, soprattutto se si memorizzano le definizioni una volta ei valori molti. JSON è un po' meno efficiente in termini di memoria, ma ovviamente è un formato IPC così comune che non dovrebbe essere escluso. Stringhe grezze, separate da caratteri, lunghezza fissa (ugh), qualunque sia il tuo desiderio, è possibile usarle. Puoi sempre comprimere i tuoi dati prima di archiviarli in Redis. Finora efficienza della memoria . Quando si tratta di velocità , è meno semplice. Se desideri utilizzare lo scripting lato server Lua (cosa che dovresti), non puoi fare nulla con i dati compressi. JSON e MsgPack possono essere deserializzati, ma solo "nel complesso". Il che va bene nella maggior parte degli scenari. La più flessibile è la memorizzazione di valori separati (ad esempio come membri di un HSET), ma anche questo ha un prezzo (il più delle volte:un prezzo troppo alto). Puoi anche combinare tutti questi. Ciò che utilizziamo di più:un prefisso di due o tre valori separati da delimitatori, seguito da un payload MsgPack.

Il mio consiglio generale è:inizia usando solo HSET e ZSET, non dividere i dati che appartengono insieme, usa nomi descrittivi PascalCased per le tue chiavi tra 10-25 caratteri, usa ':' se hai bisogno di delimitatori nelle tue chiavi (spazi dei nomi) , serializza come JSON (per semplicità, ma codice per passare facilmente a MsgPack), usa lo scripting Lua (anche se non conosci Lua, il sottoinsieme che usi in Redis è minuscolo).

Non me ne preoccuperei troppo nella fase di avvio del tuo progetto, puoi sempre cambiarlo in seguito e fare dei confronti A/B non appena hai dei dati interpolabili.

Spero che questo aiuti, TW