Obiettivo: leggere lo stato di Redis con gli strumenti nativi, individuare i
problemi di latenza e memoria, applicare il tuning di OS e Redis, ed esporre le
metriche a Prometheus.
Ogni voce mostra timestamp, durata, comando e argomenti. È il primo posto dove
guardare quando la latenza sale: spesso trovi KEYS, SMEMBERS/HGETALL su big
key, o script Lua pesanti.
Quando used_memory raggiunge maxmemory, Redis applica la
maxmemory-policy:
Terminal window
redis-cliCONFIGSETmaxmemory2gb
Terminal window
redis-cliCONFIGSETmaxmemory-policyallkeys-lru
Policy
Comportamento
Quando
noeviction
Rifiuta le scritture (errore)
Datastore: non vuoi perdere dati
allkeys-lru
Evince le chiavi meno usate di recente
Cache generica
allkeys-lfu
Evince le meno usate per frequenza
Cache con hot key stabili
volatile-lru / volatile-lfu
Come sopra ma solo tra chiavi con TTL
Mix cache + dati persistenti
volatile-ttl
Evince prima le chiavi col TTL più vicino
Mix
allkeys-random / volatile-random
Evizione casuale
Raro
Come Redis “approssima” LRU/LFU. Tenere una lista LRU esatta costerebbe
memoria e CPU; Redis invece campionamaxmemory-samples chiavi (default 5)
e evince la peggiore del campione. Più alzi maxmemory-samples, più
l’approssimazione si avvicina all’LRU reale, ma con più CPU. L’LFU (Least
Frequently Used) non conta gli accessi in modo lineare ma usa un contatore
logaritmico con decadimento nel tempo (lfu-log-factor, lfu-decay-time):
così una chiave “calda” in passato ma ora fredda perde priorità. Regola pratica:
lru va bene per la maggior parte delle cache; lfu è migliore quando hai un
piccolo insieme di hot key stabili che non vuoi vengano sfrattate da picchi
momentanei di chiavi nuove.
flowchart TD
W["Scrittura in arrivo"] --> CHK{"used_memory >= maxmemory?"}
CHK -->|no| OK["Esegui la scrittura"]
CHK -->|si| POL{"maxmemory-policy"}
POL -->|noeviction| ERR["Errore OOM: scrittura rifiutata"]
POL -->|allkeys-*| SAMP["Campiona N chiavi, evince la peggiore"]
POL -->|volatile-*| SAMP2["Campiona tra le chiavi con TTL"]
SAMP --> FREE{"liberata memoria a sufficienza?"}
SAMP2 --> FREE
FREE -->|no| SAMP
FREE -->|si| OK
Regola pratica: cache → allkeys-lru/lfu con maxmemory; datastore →
noeviction + monitoraggio della memoria. Senza maxmemory e con default
noeviction, un dataset che cresce porta a errori di scrittura o, peggio, a
RAM esaurita e OOM kill del processo.
Monitora l’efficacia con evicted_keys e l’hit ratio.
Per renderlo persistente al boot, usa un servizio systemd o il parametro kernel
transparent_hugepage=never in GRUB. Redis logga un warning all’avvio se THP è
attivo.
Su macOS questi tuning kernel non si applicano: l’ambiente macOS serve per
imparare e fare i lab funzionali, non per replicare il tuning di produzione.
Per misurare il throughput e l’effetto delle modifiche:
Terminal window
redis-benchmark-h127.0.0.1-p6379-c50-n100000-q
Terminal window
redis-benchmark-tset,get-n100000-r100000-q
-c connessioni concorrenti, -n richieste totali, -t quali comandi, -r
keyspace casuale, -q output sintetico. Fai un baseline prima e ripeti
dopo ogni modifica di tuning per misurarne l’effetto reale.
In un cluster metti un exporter per nodo (o usa la modalità multi-target) così
le metriche sono per-istanza e puoi distinguere il master in difficoltà dalla
replica sana.
Per il cluster, l’exporter può interrogare i singoli nodi (un target per nodo) o
usare la modalità multi-target. Dashboard Grafana pronte esistono per
redis_exporter (cerca per ID nella libreria Grafana).
Adatta i nomi metrica alla versione dell’exporter. Per ambienti con APM (es.
Dynatrace) esistono integrazioni/estensioni Redis equivalenti: la logica delle
metriche da allertare è la stessa elencata sopra.