What is Redis?
Redis is a key-value pair in-memory data storage structure that you can use not only as a database but also as a cache, message broker, and streaming engine. It supports various data structures such as strings, arrays, sets, hashes, bitmaps, hyperloglogs, geospatial indexes, and streams. As a developer, when you begin with Redis, you might start with strings. We will develop a demo app that uses Redis as a cache.
Why do we need Redis?
You might be wondering why we need Redis when we have numerous SQL and NoSQL Database solutions.
Well, You should not replace your entire Database with Redis as It is not designed to do so. You should use Redis on top of your existing database solutions.
But, Why!
As I mentioned before, there are different uses of Redis. For example for Web Applications, you can use Redis as a Database cache. This can dramatically improve the performance of web applications.
When a user requests data from an API or Database, it takes some milliseconds to fetch that data and send it to the user. If the data requested is stored in the Redis cache, it is possible to fetch the same data from the Redis cache instead of using the main database for subsequent requests. Consequently, the delivery of data is much faster to the users, thereby improving performance and user experience.
Installing Redis
Installation on Linux
You can install the Redis as below. This will add the Redis repository to the apt index, update it and install it on your Linux system.
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
After the installation, you can start the Redis server. You can also test it by connecting to the Redis CLI. On the terminal, run the following command.
redis-cli
This will prompt the default host and port. You can enter ping
, the command, and it will return PONG
127.0.0.1:6379> ping
PONG
If you press, Ctrl + C, you will terminate the Redis CLI.
Purpose | Linux command |
check the status of the redis-server | sudo systemctl status redis |
stop the redis-server | sudo systemctl stop redis |
restart the redis-server | sudo systemctl restart redis-server |
Installation on macOS
First of all, you can check if Homebrew is installed
$ brew --version
Then, you can install Redis by running
brew install redis
In order to test your installation run the following command on the terminal
$ redis-server
if the installation is successful, Redis will run in the foreground with the startup screen with a logo. you can stop it with Ctrl + C
if you want to start the Redis server in the background when you log in to your system, you can run the following command in the terminal
brew services start redis
if you need to stop
brew services stop redis
Installaiton on Windows
Although there is no official support for windows, you can install windows subsystems for Linux ( WSL ) and then install Redis on WSL.
Redis installation on WSL is just as you installed it on Linux. Please check the above section on installation on Linux.
After the installation, start the Redis server as a service in the background by running the command below on the WSL terminal
sudo service redis-server start
Now, you can test the server, just as in any other Linux system, by connecting to Redis CLI and executing the ping command. (Please check the above section on installation on Linux)
you can also test by running redis-server
command on WSL. This will starts Redis with a start-up screen logo in the foreground. If you need to stop it, press Ctrl + Z
.
you can stop the Redis server running in the background with the following command
sudo service redis-server stop
Can Redis run Natively in Windows?
There are developer communities and companies working on running Redis natively on Windows. One such company is Memurai.
You can also check redis-windows, which is an unofficial version of Redis for Windows X64 systems.
Useful Redis commands for beginners
You can practice the Redis command on Redis CLI. For the most part, you will be working with strings when working with Redis as developers. However, Redis does offer other data types as well. Some of the most helpful commands for developers when working with strings are in the table below.
command | Basic usage( you can use lower case /upper case) | |
SET | SET name john | name is the key, and john is the value |
GET | GET name | use the key( name ) to get the value |
EXPIRE | EXPIRE name 10 | 10 is in seconds |
SETEX | SETEX name 10 john | { name: john } expires in 10 seconds you can test with ttl name on the terminal until it expires |
KEYS | KEYS * | return all the keys on Redis. You should not use this in production. use this only for debugging your code. |
FLUSHALL | FLUSHALL | clear all key-value pairs on Redis |
DEL | DEL name | delete the key name and its associated value |
In addition, You can check the usage of other commands in the official Redis documentation.
Let's use Redis on the Node app
We will develop a demo application that uses Redis for caching. Assuming you have installed npm and the latest version of Node.js follow the steps below.
step 1
npm init
This will create a package.json file. Enter "index.js" as the entry point when creating package.json
Add "type": "module", as we will use ES 6 modules.
step 2
npm install express nodemon redis
step 3
Add "start": "nodemon index.js".
Step 4
Add the following code to index.js
import express from 'express';
import path from 'path';
import {fileURLToPath} from 'url';
import { createClient } from 'redis';
const app = express();
const port = 8080;
const client = createClient();
await client.connect();
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname, '/index.html'));
});
//read from Redis, if there is no posts, Data will be fetched from API.
//if there is data in Redis, this data will be returned
app.get('/getredis', ( req, res ) => {
client.get('posts').then( data => { //getting Redis data
if( data!= null ){
res.json( "Read from redis<br /><br />"+ data );
}else{
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then((response) => response.json())
.then(
( APIData ) => {
client.set( 'posts' , JSON.stringify( APIData ));
res.json( "API Data<br /><br />"+
JSON.stringify( APIData )
)
}
)
}
});
});
//clearing the redis cache
app.get("/clear", ( req, res ) =>{
client.flushAll().then( ( reply ) => {
res.json( reply)
})
})
app.listen(port);
console.log('Server started at http://localhost:' + port);
Node Redis 4.x, does not support callbacks and it uses promises. Therefore you need to use .then() or async..await functions for Redis commands (ex: client.get() )
Therefore, the following code( from the official docs ) will not give the required output.
client.set('foo', 'bar', (err, reply) => {
if (err) throw err;
console.log(reply);
client.get('foo', (err, reply) => {
if (err) throw err;
console.log(reply);
});
});
you can replace app.get('/getredis',())
with the code below if you wish. It uses Async...await on in fetching Redis data
app.get('/getredis', async ( req, res ) => {
const data = await client.get('posts');//getting Redis data
if( data ){
res.json( "Read from redis<br /><br />"+ data );
}else{
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then( response => response.json())
.then( APIData => {
client.set( 'posts' , JSON.stringify( APIData ));
res.json( "API Data<br /><br />"+
JSON.stringify( APIData )
)
}
)
}
});
Step 5
create Index.html, and add the following code
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Node + Express + Redis DEMO example</title>
</head>
<body>
<h1>Node + Express + Redis DEMO </h1>
<button onClick="getData()">Get posts</button>
<button onClick="clearRedis()">Clear Redis</button>
<br /><br />
<div id="display">Welcome</div>
</body>
<script>
const clearRedis = () =>{
fetch('/clear')
.then((response) => response.json())
.then((data) => document.getElementById('display').innerHTML= (data));
}
const getData = () =>{
fetch('/getredis')
.then((response) => response.json())
.then((data) => document.getElementById('display').innerHTML= data);
}
</script>
</html>
Testing the app
click on the
Get posts
button. It will fetch data from the APINow refresh the browser
Again click on
Get posts
the button. This time it will get data from the Redis cacheIf you want a clear Redis cache, click on Clear Redis
Now, click on
Get posts
button. Since there are no records on the Redis cache, it will fetch data from API
In a large database or API with a large number of records, you will see a difference in time in fetching data. Reading data from API or Database is always slow compared to reading from the Redis database cache.
Resources
Download the Demo app