Memcached vs Redis

1. Panoramica

In questo articolo, esamineremo le somiglianze e le differenze di due popolari database in memoria, Memcached e Redis.

2. Memcached e Redis

Spesso pensiamo alla memorizzazione nella cache per migliorare le prestazioni durante l'elaborazione di una grande quantità di dati.

Memcached è un sistema di memorizzazione nella cache della memoria distribuita progettato per facilità d'uso e semplicità ed è adatto come cache o archivio di sessioni .

Redis è un archivio di strutture dati in memoria che offre un ricco set di funzionalità. È utile come cache, database, broker di messaggi e coda .

3. Installazione

3.1. Installazione di Memcached

Possiamo installare l'ultimo server Memcached scaricando il pacchetto ed eseguendo make :

$ wget //memcached.org/latest $ tar -zxvf memcached-1.6.3.tar.gz $ cd memcached-1.6.3 $ ./configure && make && make test && sudo make install

3.2. Installazione di Redis

Allo stesso modo, possiamo installare l'ultimo server Redis:

$ wget //download.redis.io/releases/redis-5.0.8.tar.gz $ tar xzf redis-5.0.8.tar.gz $ cd redis-5.0.8 $ make

4. Somiglianze

4.1. Latenza inferiore al millisecondo

Sia Memcached che Redis offrono tempi di risposta inferiori al millisecondo mantenendo i dati in memoria.

4.2. Partizionamento dei dati

Allo stesso modo, entrambi i database in memoria consentono di distribuire i dati su più nodi.

4.3. Supporto dei linguaggi di programmazione

Allo stesso modo, entrambi supportano tutti i principali linguaggi di programmazione inclusi Java, Python, JavaScript, C e Ruby.

Inoltre, sono disponibili alcuni client Java per entrambi i database in memoria. Ad esempio, Xmemcached e Memcached-java-client sono disponibili per Memcached, mentre Jedis, Lettuce e Redisson sono disponibili per Redis.

4.4. Cancellazione della cache

Memcached consente di svuotare la cache utilizzando il comando flush_all . Allo stesso modo, Redis ci consente di eliminare tutto da una cache utilizzando comandi come FLUSHDB e FLUSHALL .

4.5. Ridimensionamento

Entrambe le soluzioni di memorizzazione nella cache offrono un'elevata scalabilità per gestire dati di grandi dimensioni quando la domanda cresce in modo esponenziale.

5. Differenze

5.1. Riga di comando

Memcached ci permette di eseguire comandi connettendoci al server tramite telnet:

$ telnet 10.2.3.4 5678 Trying 10.2.3.4... Connected to 10.2.3.4. 
$ stats STAT pid 14868 STAT uptime 175931 STAT time 1220540125 // ...

A differenza di Memcached, Redis è dotato di un'interfaccia a riga di comando dedicata, redis-cli , che ci consente di eseguire comandi:

$ redis-cli COMMAND 1) 1) "save" 2) (integer) 1 3) 1) "admin" 2) "noscript" // ... 2) 1) "multi" 2) (integer) 1 3) 1) "noscript" 2) "fast" // ... 3) 1) "geodist" 2) (integer) -4 3) 1) "readonly" // ... // ...

Qui, abbiamo eseguito COMANDO per elencare tutti i comandi forniti da Redis.

5.2. Dumping I / O del disco

Memcached gestisce il dumping del disco solo con strumenti di terze parti come libmemcached-tools o fork come memcached-dd.

Tuttavia, Redis fornisce meccanismi predefiniti altamente configurabili come RDB (file di database Redis) o AOF (file di sola aggiunta) per il dumping su disco. Questo può essere utile per l'archiviazione e il ripristino.

Utilizzando redis-cli, possiamo eseguire il comando SAVE sincrono per acquisire un'istantanea dei dati in memoria:

$ redis-cli SAVE OK

Qui, il comando memorizza l'istantanea in un file binario dump.rdb e restituisce lo stato OK al termine.

Tuttavia, l'esecuzione del BGSAVE asincrono avvia il processo in background per l'acquisizione di un'istantanea:

$ redis-cli BGSAVE OK

Inoltre, possiamo usare il comando LASTSAVE per controllare l'ora Unix dell'ultimo snapshot DB riuscito.

$ redis-cli LASTSAVE (integer) 1410853592

5.3. Strutture dati

Memcached memorizza le coppie chiave-valore come stringa e ha un limite di dimensione di 1 MB per valore. Tuttavia, Redis supporta anche altre strutture di dati come list, set e hash e può memorizzare valori fino a 512 MB di dimensione .

5.4. Replica

Memcached supporta la replica con fork di terze parti come repcached.

A differenza di Memcached, Redis ci fornisce funzionalità per moltiplicare i cluster replicando lo storage primario per una migliore scalabilità e alta disponibilità.

Innanzitutto, possiamo utilizzare il comando REPLICAOF per creare una replica del server master Redis. Successivamente, eseguiamo il comando PSYNC sulla replica per avviare la replica dal master.

5.5. Transazioni

Memcached non supporta le transazioni, sebbene le sue operazioni siano atomiche.

Redis provides out-of-the-box support for transactions to execute commands.

We can start the transaction using the MULTI command. Then, we can use the EXEC command for the execution of the following subsequent commands. Finally, Redis provides the WATCH command for the conditional execution of the transaction.

5.6. Publish and Subscribe Messaging

Memcached doesn't support publish/subscribe messaging out-of-the-box.

Redis, on the other hand, provides functionality to publish and subscribe to messages using pub/sub message queues.

This can be useful when designing applications that require real-time communication like chat rooms, social media feeds, and server intercommunication.

Redis comes with dedicated commands like PUBLISH,SUBSCRIBE, and UNSUBSCRIBE to publish a message to the channel, subscribe, and unsubscribe the client to the specified channels, respectively.

5.7. Geospatial Support

Geospatial support is useful for implementing location-based features for our applications. Unlike Memcached, Redis comes with special commands to manage real-time geospatial data.

For instance, the GEODIST command calculates the distance between two geospatial entries. Likewise, the GEORADIUS command returns all the entries within the radius provided.

Additionally, we can use Spring Data Redis to enable Redis geospatial support in a Java application.

5.8. Architecture

Redis uses a single core and shows better performance than Memcached in storing small datasets when measured in terms of cores.

Memcached implements a multi-threaded architecture by utilizing multiple cores. Therefore, for storing larger datasets, Memcached can perform better than Redis.

Another benefit of Memcached's multi-threaded architecture is its high scalability, achieved by utilizing multiple computational resources.

Redis can scale horizontally via clustering, which is comparatively more complex to set up and operate. Also, we can use Jedis or Lettuce to enable a Redis cluster using a Java application.

5.9. LUA Scripting

In contrast to Memcached, we can execute LUA scripts against Redis. It provides commands like EVAL and SCRIPT LOAD, useful for the execution of the LUA scripts.

For instance, we can execute the EVAL command to evaluate the script:

$ redis-cli eval "return redis.call('set',KEYS[1],'baeldung')" 1 website OK

Here, we've set the key website to the value baeldung by evaluating a script.

5.10. Memory Usage

Memcached has a higher memory utilization rate than Redis when comparing the String data structure.

In spite of that, when Redis uses the hash structure, it provides a higher memory utilization rate than Memcached.

6. Conclusion

In questo articolo, abbiamo esplorato Memcached e Redis. Innanzitutto, abbiamo esaminato le somiglianze di entrambi i database in memoria. Quindi, abbiamo esaminato le differenze nelle funzionalità fornite da entrambe le soluzioni di memorizzazione nella cache.

Sono disponibili molte soluzioni di memorizzazione nella cache in memoria. Pertanto, dovremmo considerare le funzionalità di un motore di memorizzazione nella cache e confrontarle con i nostri casi d'uso.

Possiamo sicuramente concludere che Memcached è una scelta solida per risolvere semplici problemi di cache. Tuttavia, in generale, Redis supera Memcached offrendo funzionalità più ricche e varie caratteristiche che sono promettenti per casi d'uso complessi.