Perché Redis batte Memcached per il caching

Memcached o Redis? È una domanda che quasi sempre si pone in qualsiasi discussione sull'ottimizzazione delle prestazioni da una moderna applicazione web basata su database. Quando le prestazioni devono essere migliorate, la memorizzazione nella cache è spesso il primo passo da compiere e Memcached o Redis sono in genere i primi posti a cui rivolgersi.

Questi rinomati motori di cache condividono una serie di somiglianze, ma presentano anche differenze importanti. Redis, il più nuovo e versatile dei due, è quasi sempre la scelta migliore.

Redis vs. Memcached per la memorizzazione nella cache

Cominciamo con le somiglianze. Sia Memcached che Redis fungono da archivi di dati di valori-chiave in memoria, sebbene Redis sia descritto più accuratamente come un archivio di strutture dati. Sia Memcached che Redis appartengono alla famiglia NoSQL di soluzioni per la gestione dei dati ed entrambi si basano su un modello di dati chiave-valore. Entrambi mantengono tutti i dati nella RAM, il che ovviamente li rende estremamente utili come livello di cache. In termini di prestazioni, i due archivi dati sono anche notevolmente simili, esibendo caratteristiche (e metriche) quasi identiche per quanto riguarda throughput e latenza.

Sia Memcached che Redis sono progetti open source maturi e estremamente popolari. Memcached è stato originariamente sviluppato da Brad Fitzpatrick nel 2003 per il sito Web LiveJournal. Da allora, Memcached è stato riscritto in C (l'implementazione originale era in Perl) e reso di pubblico dominio, dove è diventato una pietra angolare delle moderne applicazioni Web. L'attuale sviluppo di Memcached è incentrato sulla stabilità e sulle ottimizzazioni piuttosto che sull'aggiunta di nuove funzionalità.

Redis è stato creato da Salvatore Sanfilippo nel 2009 e Sanfilippo rimane oggi lo sviluppatore principale del progetto. Redis è talvolta descritto come "Memcached con steroidi", il che non sorprende considerando che parti di Redis sono state costruite in risposta alle lezioni apprese dall'uso di Memcached. Redis ha più funzionalità di Memcached ed è, quindi, più potente e flessibile.

Utilizzati da molte aziende e in innumerevoli ambienti di produzione mission-critical, Memcached e Redis sono supportati da librerie client in ogni linguaggio di programmazione immaginabile ed è incluso in una moltitudine di pacchetti per sviluppatori. In effetti, è uno stack web raro che non include il supporto integrato per Memcached o Redis.

Perché Memcached e Redis sono così popolari? Non solo sono estremamente efficaci, sono anche relativamente semplici. Iniziare con Memcached o Redis è considerato un lavoro facile per uno sviluppatore. Ci vogliono solo pochi minuti per configurarli e farli funzionare con un'applicazione. Pertanto, un piccolo investimento di tempo e impegno può avere un impatto immediato e drammatico sulle prestazioni, generalmente di ordini di grandezza. Una soluzione semplice con un enorme vantaggio; è il più vicino alla magia che puoi ottenere.

Quando usare Memcached

Memcached potrebbe essere preferibile quando si memorizzano nella cache dati relativamente piccoli e statici, come frammenti di codice HTML. La gestione della memoria interna di Memcached, sebbene non sofisticata come quella di Redis, è più efficiente nei casi d'uso più semplici perché consuma relativamente meno risorse di memoria per i metadati. Le stringhe (l'unico tipo di dati supportato da Memcached) sono ideali per archiviare dati che vengono solo letti, poiché le stringhe non richiedono ulteriori elaborazioni.

Set di dati di grandi dimensioni spesso implicano dati serializzati, che richiedono sempre più spazio per l'archiviazione. Mentre Memcached è effettivamente limitato all'archiviazione dei dati nella sua forma serializzata, le strutture dei dati in Redis possono archiviare qualsiasi aspetto dei dati in modo nativo, riducendo così il sovraccarico della serializzazione.

Il secondo scenario in cui Memcached ha un vantaggio su Redis è il ridimensionamento. Poiché Memcached è multithread, puoi facilmente scalare dandogli più risorse di calcolo, ma perderai parte o tutti i dati memorizzati nella cache (a seconda che tu usi hashing coerente). Redis, che è principalmente single-threaded, può scalare orizzontalmente tramite il clustering senza perdita di dati. Il clustering è una soluzione di scalabilità efficace, ma è relativamente più complesso da configurare e utilizzare.

Quando usare Redis

Avrai quasi sempre voglia di usare Redis a causa delle sue strutture di dati. Con Redis come cache, ottieni molta potenza (come la capacità di ottimizzare i contenuti e la durata della cache) e una maggiore efficienza complessiva. Una volta utilizzate le strutture dati, l'aumento dell'efficienza diventa enorme per scenari applicativi specifici.

La superiorità di Redis è evidente in quasi ogni aspetto della gestione della cache. Le cache utilizzano un meccanismo chiamato rimozione dei dati per fare spazio a nuovi dati eliminando i vecchi dati dalla memoria. Il meccanismo di eliminazione dei dati di Memcached utilizza un algoritmo utilizzato meno di recente e rimuove in modo arbitrario i dati di dimensioni simili ai nuovi dati.

Redis, al contrario, consente un controllo dettagliato sullo sfratto, permettendoti di scegliere tra sei diverse politiche di sfratto. Redis impiega anche approcci più sofisticati alla gestione della memoria e alla selezione dei candidati allo sfratto. Redis supporta lo sfratto pigro e attivo, in cui i dati vengono rimossi solo quando è necessario più spazio o in modo proattivo. 

Redis ti offre una flessibilità molto maggiore per quanto riguarda gli oggetti che puoi memorizzare nella cache. Mentre Memcached limita i nomi delle chiavi a 250 byte e funziona solo con stringhe semplici, Redis consente ai nomi e ai valori delle chiavi di essere grandi fino a 512 MB ciascuno e sono binari sicuri. Inoltre, Redis ha cinque strutture dati primarie tra cui scegliere, aprendo un mondo di possibilità allo sviluppatore dell'applicazione attraverso la memorizzazione nella cache intelligente e la manipolazione dei dati memorizzati nella cache.

Redis per la persistenza dei dati

L'utilizzo delle strutture dati Redis può semplificare e ottimizzare diverse attività, non solo durante la memorizzazione nella cache, ma anche quando si desidera che i dati siano persistenti e sempre disponibili. Ad esempio, invece di archiviare gli oggetti come stringhe serializzate, gli sviluppatori possono utilizzare un hash Redis per archiviare i campi e i valori di un oggetto e gestirli utilizzando una singola chiave. Redis Hash evita agli sviluppatori la necessità di recuperare l'intera stringa, deserializzarla, aggiornare un valore, riserializzare l'oggetto e sostituire l'intera stringa nella cache con il suo nuovo valore per ogni aggiornamento banale, il che significa minor consumo di risorse e prestazioni migliorate.

Altre strutture di dati offerte da Redis (come elenchi, set, set ordinati, hyperloglog, bitmap e indici geospaziali) possono essere utilizzate per implementare scenari ancora più complessi. I set ordinati per l'acquisizione e l'analisi di dati di serie temporali sono un altro esempio di una struttura di dati Redis che offre una complessità enormemente ridotta e un consumo di larghezza di banda inferiore.

Un altro importante vantaggio di Redis è che i dati che memorizza non sono opachi, quindi il server può manipolarli direttamente. Una parte considerevole degli oltre 180 comandi disponibili in Redis è dedicata alle operazioni di elaborazione dei dati e all'incorporamento della logica nell'archivio dati stesso tramite lo scripting Lua lato server. Questi comandi e script utente incorporati offrono la flessibilità di gestire le attività di elaborazione dei dati direttamente in Redis senza dover inviare i dati attraverso la rete a un altro sistema per l'elaborazione.

Redis offre la persistenza dei dati opzionale e regolabile, progettata per eseguire il bootstrap della cache dopo un arresto pianificato o un errore non pianificato. Sebbene tendiamo a considerare i dati nelle cache come volatili e transitori, la permanenza dei dati su disco può essere molto utile negli scenari di memorizzazione nella cache. La disponibilità dei dati della cache per il caricamento immediatamente dopo il riavvio consente un riscaldamento della cache molto più breve e rimuove il carico coinvolto nel ripopolamento e nel ricalcolo del contenuto della cache dall'archivio dati principale.

Replica dei dati in memoria Redis 

Redis può anche replicare i dati che gestisce. La replica può essere utilizzata per implementare una configurazione della cache ad alta disponibilità in grado di resistere a errori e fornire un servizio ininterrotto all'applicazione. Un errore della cache è solo leggermente inferiore al fallimento dell'applicazione in termini di impatto sull'esperienza utente e sulle prestazioni dell'applicazione, quindi avere una soluzione collaudata che garantisca il contenuto della cache e la disponibilità del servizio è un vantaggio importante nella maggior parte dei casi.

Ultimo ma non meno importante, in termini di visibilità operativa, Redis fornisce una serie di metriche e una vasta gamma di comandi introspettivi con cui monitorare e tracciare l'utilizzo e il comportamento anomalo. Statistiche in tempo reale su ogni aspetto del database, la visualizzazione di tutti i comandi in esecuzione, l'elenco e la gestione delle connessioni client: Redis ha tutto questo e altro ancora.

Quando gli sviluppatori si rendono conto dell'efficacia delle capacità di persistenza e replica in memoria di Redis, spesso lo usano come database di primo intervento, di solito per analizzare ed elaborare dati ad alta velocità e fornire risposte all'utente mentre un database secondario (spesso più lento) mantiene una registrazione storica di ciò che è accaduto. Se utilizzato in questo modo, Redis può essere ideale anche per i casi d'uso di analisi.

Redis per l'analisi dei dati

Vengono subito in mente tre scenari di analisi. Nel primo scenario, quando si utilizza qualcosa come Apache Spark per elaborare in modo iterativo set di dati di grandi dimensioni, è possibile utilizzare Redis come livello di servizio per i dati precedentemente calcolati da Spark. Nel secondo scenario, l'utilizzo di Redis come archivio dati distribuito in memoria condiviso può accelerare le velocità di elaborazione di Spark di un fattore da 45 a 100. Infine, uno scenario fin troppo comune è quello in cui i report e le analisi devono essere personalizzabili da l'utente, ma il recupero dei dati da archivi di dati intrinsecamente batch (come Hadoop o un RDBMS) richiede troppo tempo. In questo caso, un archivio della struttura dati in memoria come Redis è l'unico modo pratico per ottenere tempi di paginazione e di risposta inferiori al millisecondo.

Quando si utilizzano set di dati operativi o carichi di lavoro analitici estremamente grandi, l'esecuzione di tutto in memoria potrebbe non essere conveniente. Per ottenere prestazioni inferiori al millisecondo a un costo inferiore, Redis Labs ha creato una versione di Redis che funziona su una combinazione di RAM e flash, con la possibilità di configurare i rapporti RAM-flash. Sebbene ciò apra diverse nuove strade per accelerare l'elaborazione del carico di lavoro, offre anche agli sviluppatori la possibilità di eseguire semplicemente la loro "cache su flash".

Il software open source continua a fornire alcune delle migliori tecnologie oggi disponibili. Quando si tratta di aumentare le prestazioni delle applicazioni tramite il caching, Redis e Memcached sono i candidati più affermati e collaudati in produzione. Tuttavia, date le funzionalità più ricche di Redis, il design più avanzato, molti usi potenziali e una maggiore efficienza dei costi su larga scala, Redis dovrebbe essere la tua prima scelta in quasi tutti i casi.

---

Itamar Haber (@itamarhaber) è il chief developer advocate di Redis Labs, che offre Memcached e Redis come servizi cloud completamente gestiti per gli sviluppatori. La sua variegata esperienza include lo sviluppo di prodotti software e la gestione e ruoli di leadership presso Xeround, Etagon, Amicada e MNS Ltd. Itamar ha conseguito un Master in Business Administration dal programma congiunto Kellogg-Recanati delle università Northwestern e Tel-Aviv, nonché un Bachelor of Science in Computer Science.

Il New Tech Forum offre un luogo per esplorare e discutere la tecnologia aziendale emergente in profondità e ampiezza senza precedenti. La selezione è soggettiva, in base alla nostra scelta delle tecnologie che riteniamo importanti e di maggiore interesse per i lettori. non accetta materiale di marketing per la pubblicazione e si riserva il diritto di modificare tutti i contenuti forniti. Invia tutte le richieste a [email protected]