Memcached versus Redis

1. Overzicht

In dit artikel zullen we de overeenkomsten en verschillen onderzoeken van twee populaire in-memory databases, Memcached en Redis.

2. Memcached en Redis

Vaak denken we aan caching om de prestaties te verbeteren tijdens het verwerken van een grote hoeveelheid gegevens.

Memcached is een gedistribueerd geheugencachingsysteem dat is ontworpen voor gebruiksgemak en eenvoud en dat is het ook zeer geschikt als cache of sessieopslag.

Redis is een datastructuurarchief in het geheugen dat een uitgebreide reeks functies biedt. Het is handig als cache, database, message broker en wachtrij.

3. Installatie

3.1. Memcached installeren

We kunnen de nieuwste Memcached-server installeren door het pakket te downloaden en uit te voeren maken:

$ 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. Redis installeren

Evenzo kunnen we de nieuwste Redis-server installeren:

$ 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. Overeenkomsten

4.1. Latentie onder een milliseconde

Zowel Memcached als Redis bieden responstijden van minder dan een milliseconde door gegevens in het geheugen te bewaren.

4.2. Gegevenspartitionering

Evenzo maken beide in-memory databases het verdelen van gegevens over meerdere knooppunten mogelijk.

4.3. Ondersteuning voor programmeertalen

Evenzo ondersteunen beide alle belangrijke programmeertalen, waaronder Java, Python, JavaScript, C en Ruby.

Bovendien zijn er enkele Java-clients beschikbaar voor beide in-memory databases. Xmemcached en Memcached-java-client zijn bijvoorbeeld beschikbaar voor Memcached, terwijl Jedis, Lettuce en Redisson beschikbaar zijn voor Redis.

4.4. Cache wissen

Memcached maakt het mogelijk de cache te wissen met behulp van de flush_all opdracht. Evenzo stelt Redis ons in staat om alles uit een cache te verwijderen met behulp van opdrachten zoals SPOELENB en SPOELEN.

4.5. Schalen

Beide caching-oplossingen bieden een hoge schaalbaarheid om grote gegevens te verwerken wanneer de vraag exponentieel toeneemt.

5. Verschillen

5.1. Opdrachtregel

Memcached stelt ons in staat om opdrachten uit te voeren door verbinding te maken met de server via telnet:

$ telnet 10.2.3.4 5678 10.2.3.4 proberen ... Verbonden met 10.2.3.4. 
$ stats STAT pid 14868 STAT uptime 175931 STAT tijd 1220540125 // ...

In tegenstelling tot Memcached wordt Redis geleverd met een speciale opdrachtregelinterface, redis-cli, waardoor we opdrachten kunnen uitvoeren:

$ redis-cli COMMAND 1) 1) "save" 2) (integer) 1 3) 1) "admin" 2) "noscript" // ... 2) 1) "multi" 2) (integer) 1 3) 1) "noscript" 2) "snel" // ... 3) 1) "geodist" 2) (geheel getal) -4 3) 1) "alleen-lezen" // ... // ...

Hier hebben we geëxecuteerd OPDRACHT om alle opdrachten van Redis weer te geven.

5.2. Schijf I / O Dumping

Memcached behandelt het dumpen van schijven alleen met tools van derden zoals libmemcached-tools of forks zoals memcached-dd.

Redis biedt echter in hoge mate configureerbare standaardmechanismen zoals RDB (Redis-databasebestand) of AOF (alleen-toevoegen-bestanden) voor het dumpen van schijven. Dit kan handig zijn voor archivering en herstel.

Met redis-cli kunnen we het synchrone SPAREN opdracht om een ​​momentopname te maken van de gegevens in het geheugen:

$ redis-cli OPSLAAN OK

Hier slaat de opdracht de momentopname op in een dump.rdb binair bestand en retourneert de status OK wanneer voltooid.

De uitvoering van het asynchrone BGSAVE start het achtergrondproces voor het maken van een momentopname:

$ redis-cli BGSAVE OK

Bovendien kunnen we de LAATSTE OPSLAAN opdracht om de Unix-tijd van de laatste succesvolle DB-momentopname te controleren.

$ redis-cli LASTSAVE (geheel getal) 1410853592

5.3. Data structuren

Memcached slaat sleutel / waarde-paren op als een string en heeft een limiet van 1 MB per waarde. Echter, Redis ondersteunt ook andere datastructuren zoals lijst, set en hash, en kan waarden tot 512 MB opslaan.

5.4. Replicatie

Memcached ondersteunt replicatie met forks van derden, zoals repcached.

In tegenstelling tot Memcached biedt Redis ons functionaliteit om clusters te vermenigvuldigen door de primaire opslag te repliceren voor betere schaalbaarheid en hoge beschikbaarheid.

Ten eerste kunnen we de REPLICAOF opdracht om een ​​replica van de Redis-masterserver te maken. Vervolgens voeren we het PSYNC opdracht op de replica om de replicatie vanuit de master te starten.

5.5. Transacties

Memcached ondersteunt geen transacties, hoewel de bewerkingen atomair zijn.

Redis biedt kant-en-klare ondersteuning voor transacties om opdrachten uit te voeren.

We kunnen de transactie starten met behulp van de MULTI opdracht. Vervolgens kunnen we de EXEC commando voor de uitvoering van de volgende volgende commando's. Ten slotte biedt Redis het KIJK MAAR commando voor de voorwaardelijke uitvoering van de transactie.

5.6. Berichten publiceren en abonneren

Memcached ondersteunt niet out-of-the-box publiceren / abonneren van berichten.

Redis daarentegen biedt functionaliteit voor het publiceren van en abonneren op berichten met pub / sub-berichtenwachtrijen.

Dit kan handig zijn bij het ontwerpen van toepassingen die realtime communicatie vereisen, zoals chatrooms, feeds voor sociale media en serverintercommunicatie.

Redis wordt geleverd met speciale opdrachten zoals PUBLICEREN,ABONNEER, en AFMELDEN om een ​​bericht op het kanaal te publiceren, abonneer je respectievelijk op de klant voor de opgegeven kanalen.

5.7. Geospatiale ondersteuning

Geospatiale ondersteuning is handig voor het implementeren van locatiegebaseerde functies voor onze applicaties. In tegenstelling tot Memcached wordt Redis geleverd met speciale opdrachten om realtime georuimtelijke gegevens te beheren.

Bijvoorbeeld de GEODIST commando berekent de afstand tussen twee georuimtelijke ingangen. Evenzo is het GEORADIUS commando retourneert alle items binnen de opgegeven straal.

Bovendien kunnen we Spring Data Redis gebruiken om georuimtelijke ondersteuning van Redis in een Java-applicatie mogelijk te maken.

5.8. Architectuur

Redis gebruikt een enkele kern en vertoont betere prestaties dan Memcached bij het opslaan van kleine datasets, gemeten in termen van kernen.

Memcached implementeert een multi-threaded architectuur door gebruik te maken van meerdere cores. Daarom kan Memcached voor het opslaan van grotere datasets beter presteren dan Redis.

Een ander voordeel van Memcached's multi-threaded architectuur is de hoge schaalbaarheid, bereikt door gebruik te maken van meerdere rekenbronnen.

Redis kan horizontaal worden geschaald via clustering, wat relatief complexer is om in te stellen en te bedienen. We kunnen ook Jedis of Lettuce gebruiken om een ​​Redis-cluster mogelijk te maken met behulp van een Java-applicatie.

5.9. LUA-scripts

In tegenstelling tot Memcached kunnen we LUA-scripts uitvoeren tegen Redis. Het biedt commando's zoals EVAL en SCRIPT LADING, handig voor het uitvoeren van de LUA-scripts.

We kunnen bijvoorbeeld de EVAL commando om het script te evalueren:

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

Hier hebben we de sleutel ingesteld website naar de waarde baeldung door een script te evalueren.

5.10. Geheugengebruik

Memcached heeft een hoger geheugengebruik dan Redis bij het vergelijken van de String-datastructuur.

Ondanks dat, wanneer Redis de hash-structuur gebruikt, biedt het een hoger geheugengebruik dan Memcached.

6. Conclusie

In dit artikel hebben we Memcached en Redis onderzocht. Eerst hebben we gekeken naar de overeenkomsten van beide in-memory databases. Vervolgens hebben we gekeken naar de verschillen in de functies van beide caching-oplossingen.

Er zijn veel in-memory caching-oplossingen beschikbaar. Daarom moeten we de kenmerken van een caching-engine in overweging nemen en deze afstemmen op onze gebruiksscenario's.

We kunnen zeker concluderen dat Memcached een solide keuze is voor het oplossen van eenvoudige cacheproblemen. Over het algemeen gesproken Redis presteert beter dan Memcached door rijkere functionaliteit en verschillende functies aan te bieden die veelbelovend zijn voor complexe use-cases.