2. Memcached and Redis
Often, we think about caching to improve performance while processing a large amount of data.
Memcached is a distributed memory caching system designed for ease of use and simplicity and is well-suited as a cache or a session store.
Redis is an in-memory data structure store that offers a rich set of features. It is useful as a cache, database, message broker, and queue.
3.1. Installing Memcached
We can install the latest Memcached server by downloading the package and running make:
$ wget http://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. Installing Redis
Similarly, we can install the latest Redis server:
$ wget http://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.1. Sub-Millisecond Latency
Both Memcached and Redis offers sub-millisecond response times by keeping data in memory.
4.2. Data Partitioning
Similarly, both in-memory databases allow distributing data across multiple nodes.
4.3. Programming Languages Support
Additionally, there are a few Java clients available for both in-memory databases. For instance, Xmemcached and Memcached-java-client are available for Memcached, while Jedis, Lettuce, and Redisson are available for Redis.
4.4. Cache Clearing
Both caching solutions offer high scalability to handle large data when demand grows exponentially.
Memcached allows us to run commands by connecting to the server using 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 // ...
$ 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" // ... // ...
Here, we've executed COMMAND to list all the commands provided by Redis.
5.2. Disk I/O Dumping
However, Redis provides highly configurable default mechanisms like RDB (Redis database file) or AOF (Append-only files) for disk dumping. This can be useful for archival and recovery.
Using redis-cli, we can execute the synchronous SAVE command to take a snapshot of the in-memory data:
$ redis-cli SAVE OK
Here, the command stores the snapshot in a dump.rdb binary file and returns the status OK when complete.
However, the execution of the asynchronous BGSAVE starts the background process of taking a snapshot:
$ redis-cli BGSAVE OK
Additionally, we can use the LASTSAVE command to check the Unix time of the last successful DB snapshot.
$ redis-cli LASTSAVE (integer) 1410853592
5.3. Data Structures
Memcached stores key-value pairs as a String and has a 1MB size limit per value. However, Redis also supports other data structures like list, set, and hash, and can store values of up to 512MB in size.
Memcached supports replication with third-party forks like repcached.
Unlike Memcached, Redis provides us functionality to multiply clusters by replicating the primary storage for better scalability and high availability.
Memcached doesn't support transactions, although its operations are atomic.
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.
This can be useful when designing applications that require real-time communication like chat rooms, social media feeds, and server intercommunication.
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.
Additionally, we can use Spring Data Redis to enable Redis geospatial support in a Java application.
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.
5.9. LUA Scripting
For instance, we can execute the EVAL command to evaluate the script:
$ redis-cli eval "return redis.call('set',KEYS,'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.
In this article, we explored Memcached and Redis. First, we looked at the similarities of both in-memory databases. Then, we looked at the differences in the features provided by both caching solutions.
There are many in-memory caching solutions available. Therefore, we should consider the features of a caching engine and match them against our use cases.
We can certainly conclude that Memcached is a solid choice for solving simple caching problems. However, generally speaking, Redis outperforms Memcached by offering richer functionality and various features that are promising for complex use-cases.