Cara Terapkan Rate Limit dengan Redis untuk API

Ketika membangun API, terutama yang menyediakan data penting seperti layanan keluaran atau informasi real-time lainnya, salah satu tantangan terbesarnya adalah mengontrol traffic. Bayangkan kalau tiba-tiba ribuan request masuk dalam waktu bersamaan tanpa aturan pembatasan—server bisa kewalahan, performa drop, bahkan menyebabkan downtime.

Solusi paling populer untuk masalah ini adalah rate limiting. Dengan rate limit, kita bisa membatasi berapa banyak request yang boleh diproses dalam periode tertentu. Nah, salah satu cara paling efisien untuk menerapkan rate limit adalah menggunakan Redis.

Dalam artikel ini, kita akan bahas secara lengkap apa itu rate limit, kenapa Redis jadi pilihan tepat, serta langkah-langkah praktis menerapkan rate limit Redis API keluaran agar layanan tetap stabil, aman, dan efisien.


Apa Itu Rate Limiting?

Definisi Singkat

Rate limiting adalah teknik membatasi jumlah request yang bisa dilakukan ke API dalam jangka waktu tertentu. Misalnya, hanya 100 request per menit per user. Kalau lebih, server akan menolak request tambahan atau memberikan respons error (biasanya HTTP 429 Too Many Requests).

Kenapa Rate Limiting Penting?

  1. Mencegah Abuse → tanpa limit, user bisa melakukan spam request yang membebani server.
  2. Stabilitas Server → memastikan resource server tidak overload.
  3. Keadilan → semua user mendapat porsi akses yang seimbang.
  4. Keamanan → membantu mitigasi serangan DDoS atau brute-force.

Kenapa Redis Cocok untuk Rate Limiting?

Redis adalah in-memory database yang sangat cepat, sehingga ideal untuk operasi yang butuh performa tinggi seperti rate limit.

Alasan Redis Populer untuk Rate Limiting:

  • Cepat → karena semua data disimpan di memori, Redis bisa membaca/menulis dalam hitungan milidetik.
  • Atomic Operation → mendukung operasi atomik (misalnya INCR), yang membuat perhitungan request sangat akurat.
  • Expiry Key → Redis mendukung TTL (time-to-live) sehingga counter bisa otomatis reset setiap periode tertentu.
  • Scalable → Redis bisa dikonfigurasi dalam cluster untuk melayani traffic skala besar.

Strategi Rate Limiting dengan Redis

Ada beberapa algoritma umum untuk rate limiting.

1. Fixed Window Counter

Setiap periode waktu (misalnya 1 menit), Redis menghitung jumlah request. Kalau melewati limit, request ditolak.

  • Kelebihan: sederhana, mudah diimplementasikan.
  • Kekurangan: rawan spike di batas waktu window.

2. Sliding Window Log

Mencatat setiap request dengan timestamp, lalu hanya menghitung request dalam periode tertentu.

  • Kelebihan: lebih akurat.
  • Kekurangan: lebih boros memori.

3. Sliding Window Counter

Kombinasi fixed window dengan rata-rata bergerak. Perhitungan lebih stabil dibanding fixed window.

4. Token Bucket / Leaky Bucket

Menggunakan konsep “token” yang berkurang setiap ada request. Token akan terisi kembali dengan kecepatan tertentu.

  • Kelebihan: fleksibel, mendukung burst traffic.
  • Kekurangan: implementasi sedikit lebih kompleks.

Implementasi Rate Limit Redis untuk API

Mari kita lihat contoh praktis menggunakan Node.js + Express + Redis dengan pendekatan fixed window counter.

1. Setup Redis

Install Redis di server lokal atau gunakan layanan cloud (misalnya AWS Elasticache atau RedisLabs).

Jalankan:

redis-server

2. Install Dependency di Node.js

npm install express ioredis

3. Buat Middleware Rate Limiting

import express from "express";
import Redis from "ioredis";

const app = express();
const redis = new Redis();

const RATE_LIMIT = 100; // maksimal request
const WINDOW_SIZE = 60; // dalam detik

const rateLimiter = async (req, res, next
) => {
const userKey = `rate_limit:${req.ip}`;
const current = await redis.incr(userKey);

if (current === 1) {
// Set TTL untuk key
await redis.expire(userKey, WINDOW_SIZE
);
}

if (current > RATE_LIMIT) {
return res.status(429).json({
error: "Terlalu banyak request, coba lagi nanti."
});
}

next();
};

app.use(rateLimiter);

app.get("/keluaran", (req, res) => {
res.json({ message: "Data keluaran berhasil diakses." });
});

app.listen(3000, () => {
console.log("Server berjalan di http://localhost:3000");
});

Dengan kode di atas, setiap IP hanya bisa melakukan 100 request per menit. Kalau lebih, akan langsung diblok sementara.


Tips Optimasi Rate Limit dengan Redis

Gunakan Prefix Key yang Jelas

Pisahkan rate limit berdasarkan API endpoint agar lebih fleksibel.

Sesuaikan Limit Berdasarkan User

  • User gratis → limit lebih ketat.
  • User premium → limit lebih longgar.

Gunakan Redis Cluster untuk Skala Besar

Kalau traffic jutaan request per menit, Redis cluster bisa memastikan performa tetap stabil.

Tambahkan Header Respons

Berikan informasi rate limit pada header agar user tahu status limitnya.

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 20
X-RateLimit-Reset: 1693326000

Monitoring & Logging

Integrasikan rate limiter dengan monitoring (misalnya Grafana atau ELK) agar tim DevOps bisa memantau abuse atau traffic abnormal.


Studi Kasus Penerapan Rate Limit

API Keluaran Harian

Tanpa rate limit, user bisa melakukan ribuan request per detik untuk scraping data keluaran. Dengan Redis, request bisa dibatasi agar API tetap stabil.

Layanan Login

Rate limit bisa mencegah brute-force attack pada endpoint login. Misalnya hanya izinkan 5 percobaan per menit per IP.

Aplikasi Mobile

Dengan traffic tinggi, rate limiting membantu memastikan semua user mendapatkan akses merata tanpa membebani server utama.


Insight Jangka Panjang

Menerapkan rate limit Redis API keluaran bukan hanya soal menjaga server tetap hidup, tapi juga bagian dari strategi keamanan dan kualitas layanan. Dengan rate limiting, kita bisa:

  • Menghindari abuse,
  • Mencegah downtime,
  • Menjaga performa API,
  • Memberikan pengalaman yang lebih adil untuk semua user.

Kalau saat ini API-mu masih terbuka tanpa batasan, coba pertimbangkan untuk mulai menambahkan rate limiter dengan Redis. Investasi waktu beberapa jam bisa menghemat biaya recovery downtime berhari-hari.