Skip to main content

Cache Endpoint Menggunakan Redis di Aplikasi Express.js

· 4 min read
Jacky Rusly

Cache adalah tempat penyimpanan data secara sementara. Fungsi cache adalah untuk mempercepat response time pada aplikasi kita. Contohnya kita memiliki satu endpoint yang secara query database nya sangat kompleks, sehingga memerlukan waktu yang lama untuk mengembalikan data. Di sini kita bisa memanfaatkan cache supaya aplikasi kita tidak selalu melakukan query ke database.

Untuk mengetahui lebih lanjut bagaimana cara menerapkannya, mari baca terus ya sampai selesai dan lebih baik lagi kalau sambil dipraktikkan.

Setup Project

Pertama-tama kita langsung saja membuat project Express.js. Buat 1 folder misalnya cache-redis-example dan buka folder tersebut di editor yang kalian pakai. Kalau saya pakai VSCode.

Kemudian buka terminal dan jalankan command berikut:

yarn init -y

Selanjutnya kita akan install dependencies yang dibutuhkan menggunakan command berikut:

yarn add express redis dotenv

Buat 1 file index.js yang berisi berikut ini:

const express = require('express');

const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
res.json({
message: 'Hello World',
});
});

app.listen(port, () => {
console.log(`App listening on port ${port}`);
});

Jalankan aplikasi dengan command:

node index.js

Kemudian buka http://localhost:3000, maka hasilnya akan muncul:

{ "message": "Hello World" }

Setup Redis

Kalau di komputer kalian belum ada Redis, kalian bisa install sesuai dengan OS komputer kalian dengan mengikuti instruksi Redis Getting Started.

Di tutorial kali ini agar lebih mudah, saya akan menggunakan Redis Labs. Kalau kalian mau coba, bisa ke Redis Labs.

Redis Labs

Redis Labs ini di cloud dan ada free-tier-nya, sangat cocok dipakai untuk belajar karena tidak perlu menginstall Redis di komputer local kita.

Redis Client

Kita akan buat Redis Client di aplikasi kita. Buat satu file redis.js yang berisi berikut:

require('dotenv').config();

const redis = require('redis');

const redisClient = redis.createClient({
url: process.env.REDIS_URL,
});

module.exports = redisClient;

Kemudian kita akan buat 1 file .env untuk menampung credential Redis kita yang berisi:

REDIS_URL=(Url Redis kalian, kalau Redisnya di local komputer REDIS_URL ini bisa dibiarkan kosong)

Contoh kalau menggunakan Redis Labs:

REDIS_URL=redis://default:MNh4GnWxgQ60JeQMdqDZMBz1qtoWJqyf@redis-17145.c1.ap-southeast-1-1.ec2.cloud.redislabs.com:17145

Cache Middleware

Buat satu file di middlewares/cache.middleware.js yang berisi berikut:

const redisClient = require('../redis');

const generateCacheKey = (req) => {
const query = Object.keys(req.query).length > 0 ? `_${JSON.stringify(req.query)}` : '';
const key = `CACHE_${req.route.path}${query}`;

return key;
};

const cacheMiddleware = async (
req,
res,
next,
) => {
const key = generateCacheKey(req);
const cache = await redisClient.get(key);

if (cache) {
return res.json(JSON.parse(cache));
}

return next();
}

module.exports = {
cacheMiddleware,
generateCacheKey,
};

Dapat dilihat isi file di atas. Key Redis yang dipakai adalah CACHE_{Route Path}_{Query String}. Kalian bisa sesuaikan dengan kebutuhan kalian.

Apply Cache

Ada beberapa code yang harus diubah di file index.js:

const express = require('express');
const { cacheMiddleware, generateCacheKey } = require('./middlewares/cache.middleware');
const redisClient = require('./redis');

const app = express();
const port = process.env.PORT || 3000;

const ONE_MINUTE = 60;

// Hanya untuk contoh, misalnya get data memerlukan 2 detik
const getDataFromDatabase = async () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
id: 1,
name: 'Jacky Rusly'
});
}, 2000);
});
};

(async () => {
await redisClient.connect();

app.get('/', cacheMiddleware, async (req, res) => {
const data = await getDataFromDatabase();
const response = {
data,
};

const key = generateCacheKey(req);
await redisClient.setEx(key, ONE_MINUTE, JSON.stringify(response));

res.json(response);
});

app.listen(port, () => {
console.log(`App listening on port ${port}`);
});
})();

Demo

Selanjutnya kita harus restart aplikasi kita:

node index.js

Kemudian coba buka http://localhost:3000. Pada request pertama response timenya yaitu 2 seconds dan aplikasi kita akan generate cache yang akan expire dalam 60 seconds.

Before Cache

Pada saat request ke 2 dan seterusnya hanya 32 millisecond.

After Cache

Peringatan

Ada case di mana kita mau refresh cache ketika ada perubahan data di database. Untuk itu kita bisa clear data cache yang ada di Redis dengan code berikut:

redisClient.del('Key yang akan dihapus');

Penutup

Untuk contoh codenya bisa dilihat pada GitHub Repository Cache Redis Example.

Begitulah cara untuk melakukan cache endpoint menggunakan Redis di aplikasi Express.js kita. Semoga artikel ini bisa bermanfaat bagi teman-teman.