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

Redis vs. Memcached – Confronto 2021

Redis sta per RE piccolo DI dizionario S erver, creato nel 2009 da Salvatore Sanfilippo. Memcached, invece, è stato creato nel 2003 da Brad Fitzpatrick. Sia Redis che Memcached sono:

  • Strutture di dati in memoria NoSQL
  • Scritto in C
  • Open source
  • Utilizzato per velocizzare le applicazioni
  • Supporta una latenza inferiore al millisecondo

Nel 2014, Salvatore ha scritto un eccellente post su StackOverflow su quando ha più senso usare Memcached che Redis. In questo post, forniamo un confronto aggiornato e dettagliato tra Redis e Memcached in modo che tu possa fare una scelta informata sul loro utilizzo nella tua applicazione.

Infografica

Questo post è stato condensato nell'infografica qui sotto. Con questa infografica puoi facilmente visualizzare i risultati di questo confronto per vedere quale esce in testa in diversi scenari. Se vuoi leggere il confronto in formato testo, clicca qui.

Documentazione

Per cominciare, Redis è documentato in modo molto più completo di Memcached. Ciò semplifica l'apprendimento, l'amministrazione e l'utilizzo.

Modello di database

Redis è principalmente un archivio di valori chiave. Sebbene le chiavi siano stringhe binarie, il vantaggio di Redis è che il valore non è limitato alle sole stringhe binarie. Possono essere una varietà di strutture di dati che consentono la memorizzazione di oggetti complessi e forniscono una ricca serie di operazioni su di essi. Redis prevede anche l'estendibilità tramite moduli Redis. I moduli Redis sono estensioni che forniscono strutture dati aggiuntive e funzionalità non disponibili all'interno del set di funzionalità principali. Ecco un esempio di alcune funzionalità che sono ora disponibili come moduli:

  • Archivio documenti
  • DBMS grafico
  • Motore di ricerca
  • DBMS serie storiche

Memcached è un semplice archivio di valori di chiavi che supporta solo stringhe binarie come valore.

Strutture di dati

Come accennato in precedenza, Redis offre più tipi di struttura dei dati che gli consentono di essere estremamente flessibile da usare, inclusi stringhe, hash, elenchi, insiemi, insiemi ordinati, bitmap, campi di bit, HyperLogLog, Indici geospaziali e Stream. Puoi saperne di più su questi in questo articolo Principali casi d'uso Redis per tipi di struttura dati principali.

Fonte immagine:https://redislabs.com/redis-enterprise/data-structures/

Memcached supporta solo semplici stringhe binarie che sono ottime per dati di sola lettura, quindi se non hai bisogno di tutti i campanelli e fischietti di Redis, Memcached è un database più semplice per te da usare.

Classificazione e popolarità del database

La maggiore popolarità di un database si traduce in una più ampia comunità di utenti, più discussioni e tutorial generati dagli utenti e più aiuto e supporto tramite strumenti di terze parti come piattaforme DBaaS e strumenti di analisi per ottimizzare le tue implementazioni.

Redis è l'8° database più popolare al mondo a febbraio 2021, secondo DB-Engines per la sua semplicità, ricche strutture di dati e ottima documentazione. Memcached è attualmente classificato come il 28° database più popolare. Quando Redis e Memcached sono classificati rispetto ai modelli di database valore-chiave, Redis è al 1° e Memcached al 4°. Tuttavia, se stai cercando solo un database chiave-valore open source o uno che può essere distribuito in locale, Memcached è al secondo posto poiché sia ​​Amazon DynamoDB che Microsoft Azure Cosmos DB sono entrambi database commerciali che possono essere distribuiti solo in la nuvola.

Architettura

Redis e Memcached seguono entrambi server-client architettura. I client popolano i dati nel server sotto forma di valore-chiave.

Redis è a thread singolo mentre Memcached ha un'architettura multithread. Memcached si adatta meglio su un sistema con più core in grado di gestire più operazioni se la capacità di calcolo viene ridimensionata. Tuttavia, è possibile avviare più di un'istanza Redis sullo stesso sistema per utilizzare core aggiuntivi.

Facilità d'uso

Come spiegato sopra nella sezione Modello di database, Redis, essendo un database multi-modello, può essere utilizzato con qualsiasi tipo di modello di dati. In Redis, è facile scrivere codice poiché semplifica le attività complesse. Redis ha strutture di dati avanzate e non si limita a semplici valori di stringa. Ad esempio, se la tua applicazione archivia i dati in set e desideri tenere traccia dei set in un elenco, puoi farlo facilmente in Redis. Un'attività simile su Memcached non è possibile. Ma ci sono altri modi per eseguire le stesse attività che richiedono più righe di codice.

Memcached, d'altra parte, memorizza solo valori di stringa semplici. Quindi, l'applicazione deve occuparsi della complessità della struttura dei dati.

Partizionamento dei dati

Redis supporta il partizionamento dei dati tra più istanze di nodi. Gli attuali utenti di Redis sfruttano diverse tecniche come il partizionamento dell'intervallo, il partizionamento hash e l'hashing coerente per il partizionamento dei dati. In Redis, il partizionamento dei dati può essere implementato in tre modi diversi:

  • Partizionamento lato client
  • Partizionamento assistito da proxy (esempio:twenproxy)
  • Partizionamento lato server con instradamento delle query all'interno dei nodi del cluster

Memcached supporta anche il partizionamento dei dati su più nodi e l'hashing coerente è un approccio consigliato per garantire che il carico di traffico sia distribuito uniformemente.

Redis vs Memcached - Confronto 2021Fai clic per twittare

Lingue supportate

Redis supporta quasi tutti i linguaggi di programmazione più utilizzati, da quelli di alto livello a quelli di basso livello. Memcached, tuttavia, supporta un numero inferiore di lingue rispetto a Redis, ma supporta tutte le lingue popolari.

Memcached

  • .Net
  • C
  • C++
  • Fusione Fredda
  • Erlang
  • Java
  • Lisp
  • Lua
  • OCaml
  • Perl
  • PHP
  • Pitone
  • Rubino

Redis

  • C
  • C#
  • C++
  • Clojure
  • Cristallo
  • D
  • Dardo
  • Elisir
  • Erlang
  • Fantastico
  • Vai
  • Haskell
  • Haxe
  • Java
  • JavaScript (Node.js)
  • Lisp
  • Lua
  • MatLab
  • Obiettivo-C
  • OCaml
  • Pascal
  • Perl
  • PHP
  • Prologo
  • Dati puri
  • Pitone
  • R
  • Ribolle
  • Rubino
  • Ruggine
  • Scala
  • Schema
  • Chiacchiere
  • Veloce
  • Tcl
  • Visual Basic

Transazioni

Le "transazioni" Redis vengono eseguite con le tre garanzie seguenti:

  • Le transazioni vengono serializzate ed eseguite in sequenza
  • O tutti i comandi, o nessuno, vengono elaborati (transazioni atomiche)
  • Il blocco ottimistico offre una garanzia aggiuntiva utilizzando il check-and-set

Redis si assicura che tutto un solo comando da una macchina client venga eseguito alla volta. Tutti i comandi nelle transazioni vengono eseguiti quando viene chiamato il comando "EXEC" per garantire l'atomicità.

Memcached, invece, non fornisce la gestione delle transazioni.

Replica

Redis offre una semplice replica leader-follower (master-slave) che crea copie esatte delle istanze master, con queste caratteristiche:

  • Il master continua a inviare comandi dati allo slave finché questi sono collegati.
  • Se la connessione si interrompe, lo slave seguirà una risincronizzazione parziale copiando solo i dati persi durante la disconnessione.
  • Se la risincronizzazione parziale non è possibile, tenterà una risincronizzazione completa.

Puoi anche sfruttare le funzionalità di alta disponibilità, Redis Sentinels o Redis Cluster, per una protezione avanzata dal failover.

Native Memcached non supporta la replica, ma puoi utilizzare Repcached, una patch open source gratuita per ottenere un'elevata disponibilità per la tua distribuzione. Offre la replica multi master, la replica asincrona dei dati e supporta tutti i comandi Memcached.

Istantanee/Persistenza

Le istantanee sono semplicemente una vista di sola lettura del database com'era in un determinato momento. Redis supporta le istantanee e, per impostazione predefinita, Redis salva le istantanee del set di dati su disco in un file binario chiamato dump.rdb. Puoi chiamare manualmente uno snapshot o personalizzare la frequenza o modificare la soglia per l'esecuzione dell'operazione.

Ecco le due opzioni di persistenza supportate da Redis:

  • Persistenza RDB
  • Persistenza AOF

RDB sta per "Redis Database Backup". Si tratta di uno snapshot point-in-time compatto del database in un momento specifico. Occupa meno spazio, massimizza le prestazioni di Redis ed è utile per il ripristino di emergenza.

AOF sta per "Aggiungi solo file". AOF tiene traccia di tutti i comandi eseguiti e, in una situazione disastrosa, esegue nuovamente i comandi per recuperare i dati. Questo metodo richiede più spazio poiché tutti i comandi vengono eseguiti di nuovo e non è un metodo molto duraturo di snapshot.

Memcached d'altra parte non supporta la persistenza del disco.

Script lato server

Lua è il linguaggio di scripting incorporato per il tuo server Redis, disponibile a partire dalla versione 2.6, che ti consente di eseguire operazioni all'interno di Redis per semplificare il tuo codice e aumentare le prestazioni. Le due funzioni principali utilizzate per valutare gli script utilizzando l'interprete Lua sono:

  • VAL.
  • EVALSH

Quando lo script Lua viene eseguito, tutte le altre richieste vengono bloccate come mostrato nella figura seguente.

Redis include anche il debugger di script Lua nella versione 3.2 che semplifica la scrittura di script complessi e aiuta a migliorare le prestazioni.

Memcached non supporta alcuno scripting lato server.

Scalabilità

Esistono due tecniche per ridimensionare orizzontalmente il database Redis:

  • Aggiunta di frammenti nei cluster Redis
  • Aggiunta di nodi a una configurazione Redis HA (master/replica)

Puoi anche ridimensionare verticalmente la tua configurazione Redis quando hai bisogno di più memoria o elaborazione. Può essere fatto senza tempi di inattività se si dispone di una configurazione HA o si utilizza la tecnologia Redis Cluster.

Il server Memcached non fornisce un meccanismo per distribuire i dati tra i nodi (sharding). Quindi, in Memcached, la scalabilità orizzontale è semplice come aggiungere più nodi:il problema del partizionamento dei dati in frammenti diversi dovrà essere eseguito a livello di applicazione/client. Ci sono alcuni strumenti open source che possono aiutarti in questo.

Protocollo di comunicazione

Redis utilizza TCP come protocollo di rete e non supporta UDP.

Memcached supporta sia i protocolli di comunicazione TCP che UDP. I dati vengono inviati al server Memcached in due forme:

  • Righe di testo:invia comandi e ricevi risposte dal server.
  • Dati non strutturati:ricevi o invia informazioni sul valore per una determinata chiave e i dati vengono restituiti nello stesso formato fornito.

Politiche di rimozione della cache supportate

Redis supporta diversi tipi di politiche di sfratto. Diamo un'occhiata ad alcuni.

  • Nessuna sfratto:  In "noeviction" viene restituito un errore quando la memoria raggiunge il limite.
  • allkeys-lru:  Lru sta per "usato meno di recente". Questa norma rimuove i dati utilizzati meno di recente.
  • allkeys-lfu:  Lfu sta per "usato meno frequentemente". Questa norma rimuove i dati utilizzati meno frequentemente.
  • tutti i tasti casuali:  Questa norma rimuove i dati in modo casuale.
  • volatile-lru:  I dati volatili sono con set di dati di scadenza. Questa norma rimuove i dati volatili utilizzati meno di recente.
  • lfu volatile:  I dati volatili sono con set di dati di scadenza. Questa norma rimuove i dati volatili utilizzati meno di frequente.
  • volatile casuale:  Questa norma rimuove i dati volatili in modo casuale.
  • ttl volatile:  “TTL” sta per tempo da vivere. Questa norma rimuove i dati che hanno il minor tempo di vita.

Memcached utilizza l'algoritmo LRU per eliminare i dati quando è richiesto spazio. Prima cerca i dati già scaduti da eliminare se i dati scaduti non sono disponibili viene utilizzato l'algoritmo LRU.

Pubblica e iscriviti ai messaggi

Redis supporta la messaggistica Pub/Sub (pubblica e iscriviti). Ci sono tre comandi che vengono utilizzati per questo scopo.

Il client utilizza:

  • Iscriviti
  • Annulla iscrizione

Iscriviti e annulla l'iscrizione vengono utilizzati per ricevere messaggi da un canale specifico.

Il server utilizza:

  • Pubblica

La "pubblicazione" viene utilizzata per inviare i dati ai client.

Memcached non supporta i messaggi di pubblicazione e iscrizione.

Supporto per gli stream

Redis supporta flussi simili a Kafka con versione 5.0 o successiva utilizzando una nuova struttura di dati "Redis Streams". Redis Streams ha il concetto di gruppi di consumatori, come Apache Kafka, che consente alle applicazioni client di consumare i messaggi in modo distribuito, semplificando la scalabilità e la creazione di sistemi a disponibilità elevata.

Memcached non offre supporto nativo per Stream, ma ci sono strumenti di libreria open source come Kafcache per l'elaborazione del flusso a bassa latenza.

Supporto geospaziale

Redis ha una struttura dati chiamata Indici geospaziali che memorizza i dati di longitudine e latitudine di una posizione. Puoi eseguire diverse operazioni sui dati geospaziali, come calcolare la distanza tra due punti o trovare luoghi vicini.

Memcached non ha strutture dati speciali per gestire i dati geospaziali.

Prestazioni

Un confronto delle prestazioni tra archivi di dati chiave-valore in memoria è più un esercizio intellettuale che un'importanza pratica, a meno che non si stiano implementando sistemi su una scala tale che ciò diventi interessante in quanto una misura di risparmio sui costi. Questo perché tali archivi sono legati all'IO e di solito la latenza di rete potrebbe svolgere un ruolo maggiore nella latenza percepita dall'applicazione rispetto alla latenza del database.

Un aspetto più pratico delle prestazioni è l'efficienza di archiviazione:quanti dati possono essere impacchettati nella stessa quantità di memoria. Anche qui, le strutture dati interne utilizzate da Redis variano in base alla dimensione dei dati. Quindi qualsiasi discussione sulle prestazioni tra questi database dovrebbe essere presa con le pinze.

Diamo un'occhiata ad alcuni confronti mostrati in un documento di ricerca del 2016. In questo articolo, gli autori sperimentano i database in-memory ampiamente utilizzati per misurare le loro prestazioni in termini di:

  1. Il tempo impiegato per completare le operazioni.
  2. Con quanta efficienza usano la memoria durante le operazioni.

Versioni del database utilizzate nel documento:

Database Versione
Redis 3.0.7
Memcached 1.4.14

Scrivi operazione

Durante la scrittura dei dati, come puoi vedere, nella tabella sottostante Memcached mostra una velocità eccezionale anche dopo che il numero di record è salito a milioni.

Il tempo calcolato per scrivere coppie chiave-valore (ms)

Numero di record
Banca dati 1.000 10.000 100.000 1.000.000
Redis 34 214 1.666 14.638
Memcached 23 100 276 2.813

Leggi operazione

La lettura dei dati rimane quasi coerente in Redis anche per un milione di record, ma in Memcached man mano che il numero di record aumenta, anche il tempo aumenta leggermente.

Il tempo trascorso per leggere il valore corrispondente a una determinata chiave per database (ms)

Numero di record
Banca dati 1.000 10.000 100.000 1.000.000
Redis 8 6 8 8
Memcached 9 14 14 30

Utilizzo della memoria

Mentre si discute dell'utilizzo della memoria, Redis è sempre il migliore, come puoi vedere nei risultati.

Utilizzo della memoria dei database in memoria per operazioni di scrittura (MB)

Numero di record
Banca dati 1.000 10.000 100.000 1.000.000
Redis 2.5 3.8 4.3 62.7
Memcached 5.3 27.2 211 264,9

Come puoi vedere Redis è migliore di Memcached.

Utilizzo della memoria dei database in memoria per l'operazione di eliminazione (MB)

Numero di record
Banca dati 1.000 10.000 100.000 1.000.000
Redis 0 0 0 0
Memcached 2.2 2.1 2.2 2.2

Servizi gestiti/assistenza

La maggiore popolarità e community per Redis ha anche determinato la necessità di servizi gestiti, hosting e supporto. I provider di database gestiti più diffusi per Redis™* includono ScaleGrid, Redis Labs, AWS Elasticache, Azure Cache e DigitalOcean. Questa pagina fornisce un ottimo confronto tra i principali fornitori di Redis™. Redis dispone anche di ampi strumenti di reporting interni come hit cache, utilizzo della memoria, operazioni e persino una query lenta registrata.

I servizi gestiti per Memcached sono molto meno disponibili, ma sono comunque supportati tramite Amazon Elasticache.

Supporto Transport Layer Security (TLS)

Redis ha il supporto TLS nativo a partire da Redis 6.0. Le versioni precedenti di Redis consigliavano l'uso di stunnel per fornire supporto TLS.

Memcached 1.5.13 e versioni successive supportano l'autenticazione e la crittografia tramite TLS. Questa funzione è ancora in fase sperimentale.

Autenticazione

Fino a Redis 5.x, Redis supportava solo una semplice autenticazione basata su password. Questa password è stata memorizzata in chiaro sul server. Redis dalla versione 6.0 in poi supporta un ACL completo.

Memcached versione 1.4.3 e successive ha il supporto SASL. In precedenza Memcached non aveva un livello di autenticazione.

Riepilogo

Redis e Memcached sono entrambi fantastici e hanno applicazioni in aree diverse. Redis sviluppato in seguito ha molte funzionalità avanzate e ha un'ottima documentazione e community.

Ti interessa saperne di più su ScaleGrid?

Per ulteriori informazioni su come ScaleGrid Hosting for Redis™* può aiutarti a gestire i database, consulta la nostra pagina ScaleGrid Service for Redis™. Scopri come l'hosting ScaleGrid per Redis™ ti consente di concentrarti maggiormente sullo sviluppo del tuo prodotto e meno sulla gestione dei database.

*Redis è un marchio di Redis Labs Ltd. Tutti i diritti ivi contenuti sono riservati a Redis Labs Ltd. Qualsiasi utilizzo da parte di ScaleGrid è solo a scopo referenziale e non indica alcuna sponsorizzazione, approvazione o affiliazione tra Redis e ScaleGrid.