Redis è un archivio dati in memoria, il che significa che l'intero set di dati è archiviato in memoria (RAM). Anche se questo è ottimo per le prestazioni, quando la dimensione dei dati inizia a crescere, è necessario aggiungere sempre più RAM per contenere tutti quei dati. Questo può diventare rapidamente proibitivo e prima che tu te ne accorga, i costi del server iniziano a salire alle stelle, lasciandoti preoccupato se Redis può scalare per te in modo conveniente.
Questo è, ovviamente, un problema comune con qualsiasi database, ma fa più male nel caso di database in memoria come Redis, poiché la RAM è più costosa dell'archiviazione secondaria come dischi rigidi e SSD. Dobbiamo ricordare, tuttavia, che Redis non ha lo scopo di memorizzare terabyte di dati per la tua applicazione. Piuttosto, è pensato per essere utilizzato per archiviare specificamente quei dati che devono essere letti (e, in misura minore, scritti) a una velocità molto elevata, mentre il resto dei dati può risiedere su database tradizionali supportati da disco. A tal fine, Redis viene spesso utilizzato come cache, poiché contiene solo i dati più attivi con requisiti di velocità effettiva di lettura/scrittura elevati (si pensi ai tabelloni segnapunti e ai messaggi di chat in tempo reale). Quindi, il principale colpevole dell'utilizzo eccessivo della memoria con Redis è il comportamento dell'applicazione. La tua applicazione potrebbe memorizzare dati non necessari che non traggono vantaggio dall'essere in Redis, o anche dati completamente ridondanti, ovvero dati che non sono mai stati utilizzati per nessuno scopo, come lo era questo utente.
Per diagnosticare problemi con un utilizzo eccessivo della memoria, abbiamo ovviamente bisogno di un modo per scoprire quali chiavi stanno utilizzando più memoria in modo da poter iniziare a ragionare e capire quali comportamenti dell'applicazione stanno causando il problema. Ricorda, l'ottimizzazione prematura è la radice di tutti i mali e Redis non fa eccezione. Abbiamo assolutamente bisogno di visibilità sulle caratteristiche di memoria del nostro set di dati per iniziare anche a pensare a dove si trova il problema e come possiamo risolverlo. Di seguito, esploriamo alcune delle opzioni disponibili per dare un'occhiata ai nostri dati Redis e trovare quelle aree che possono trarre vantaggio dall'ottimizzazione a livello di applicazione.
Il comando USO DELLA MEMORIA
Questo comando dal nome appropriato è disponibile da Redis 4.0.0 ed è il primo passo per il debug dei problemi di memoria con Redis. Dai documenti:
Il comando USO DELLA MEMORIA riporta il numero di byte che una chiave e il suo valore richiedono per essere memorizzati nella RAM. L'utilizzo riportato è il totale delle allocazioni di memoria per i dati e le spese generali amministrative richieste da una chiave per il suo valore.
Ecco un esempio:
MEMORY USAGE users_by_reputation
(integer) 2923419
Viene restituito un numero intero semplice che rappresenta il numero di byte utilizzati per memorizzare la chiave, il valore e le spese generali interne. Per trovare rapidamente l'utilizzo della memoria di una chiave particolare, non c'è niente di più semplice di così.
Due possibili svantaggi sono:
- Questo comando è disponibile solo in Redis 4.0.0 e versioni successive. Ciò esclude la maggior parte dei provider di servizi cloud.
- Ti dice solo la memoria utilizzata da una singola chiave, quindi a meno che tu non sappia in anticipo quale o quali chiavi stanno causando il problema, questo comando ha un'utilità molto limitata.
redis-rdb-tools
redis-rdb-tools è un piccolo e ingegnoso strumento da riga di comando che va oltre l'umile MEMORY USAGE
comando di cui abbiamo parlato sopra. È uno strumento di profilazione della memoria popolare e potente creato appositamente per Redis che analizza un file di dump Redis (.rdb) e genera un profilo di memoria dettagliato per ciascuna chiave nel dump, inclusi dettagli come la memoria utilizzata, il tipo di dati, il numero di elementi, ecc. Consente inoltre di filtrare le chiavi che vengono elaborate, in modo da poter eseguire facoltativamente l'analisi su una chiave particolare o su un sottoinsieme di chiavi che corrispondono a un modello particolare. L'output dell'analisi è un file CSV con colonne per chiave, memoria utilizzata, tipo di dati, numero di elementi, ecc.
Questo strumento è fantastico perché, a differenza di MEMORY USAGE
comando, che funziona solo su una singola chiave, questo strumento analizza l'intero set di dati e sputa il risultato in formato CSV, il che significa che puoi caricarlo in qualsiasi database SQL ed eseguire qualsiasi query tu voglia, ordinandolo e filtrandolo come desideri , con tutta la potenza di SQL, che ti offre una visione approfondita del costo della memoria dei tuoi dati. Come bonus, se stai utilizzando versioni di Redis precedenti alla 4.0.0, puoi comunque utilizzare questo strumento per analizzare le singole chiavi se lo desideri, poiché questo strumento funziona analizzando il dump binario prodotto da Redis, invece di fare affidamento su Redis per segnalare l'utilizzo della memoria. D'altro canto, questa differenza di approccio significa che l'utilizzo della memoria calcolato è più una stima che una cifra esatta, come menzionato nella documentazione del progetto. Tuttavia, questo non è realmente un problema quando il nostro obiettivo è identificare i problemi di utilizzo della memoria, poiché siamo più interessati alle dimensioni relative delle chiavi e all'identificazione delle chiavi che utilizzano molta più memoria che dovrebbero utilizzare, quindi alcuni byte qua o là è davvero irrilevante.
RDBTools
RDBTools è uno strumento basato sul web che offre diversi strumenti per gestire e ottimizzare Redis, con particolare attenzione all'ottimizzazione della memoria. È nato dal progetto open source redis-rdb-tools discusso sopra. Con esso possiamo analizzare senza sforzo l'utilizzo della memoria del nostro server Redis semplicemente puntando alla nostra istanza e facendo clic su "Analizza". Lo strumento scarica un dump dall'istanza in esecuzione e lo analizza, presentandoti un'interfaccia utente intuitiva per filtrare e ordinare le chiavi in base a vari parametri come l'utilizzo della memoria, il tipo di dati, la codifica, il numero di elementi, ecc., in modo simile alla riga di comando strumento, ma senza lo sforzo manuale necessario per eseguire un dump, generare il profilo di memoria, impostare un database, importare il profilo, scrivere ed eseguire query, ecc.
Oltre a ciò, RDBTools genera anche diversi grafici e grafici dal profilo di memoria, consentendoti una visione ancora maggiore dei tuoi dati, insieme a consigli per ottimizzare la configurazione del tuo server Redis, sulla base degli standard del settore e anni di esperienza nell'ottimizzazione di Redis, per spremere ancora più risparmio di memoria. Oltre all'ottimizzazione della memoria, ci sono una serie di altre funzionalità utili per chiunque utilizzi Redis, come una ricca CLI integrata, un editor di configurazione con documentazione inline, un visualizzatore di dati in tempo reale, ecc.
RDBTools è disponibile come immagine Docker, disponibile nell'hub Docker e può essere eseguito sul tuo computer, quindi non devi preoccuparti di perdere dati sensibili. Una versione di prova è disponibile gratuitamente per sempre, con alcuni limiti di utilizzo. Consulta la pagina dei prezzi per ulteriori informazioni sui vari piani a pagamento disponibili.
Conclusione
L'esaurimento della memoria è un problema inevitabile quando si utilizzano database in memoria come Redis. Come tutti i problemi di ottimizzazione, il primo passo è diagnosticare correttamente il problema. È importante resistere alla tentazione di saltare rapidamente a conclusioni basate su ipotesi non verificate. "Misura, misura, misura" è il nome del gioco quando si tratta di ottimizzazione, e ci sono vari metodi e strumenti per ottenere informazioni dettagliate sui tuoi problemi di memoria Redis. Quale sia il migliore dipende dalle tue esigenze specifiche e da dove ti trovi nel processo di sviluppo. Per qualcuno che sta appena iniziando a usare Redis, tenere d'occhio i singoli tasti potrebbe essere sufficiente per iniziare, mentre per gli utenti pesanti di Redis, ha sicuramente senso scegliere uno strumento GUI dedicato con tutti i campanelli e i fischietti per risparmiare dolore in seguito. Qualunque sia la tua scelta, assicurati sempre di comprendere la radice del tuo problema prima di provare a risolverlo e ricorda, se hai problemi di memoria con Redis, probabilmente stai utilizzando più memoria di quella di cui hai veramente bisogno.