Open PortfolioOpen Portfolio.
โ† Back to Blog

How to Implement Rate Limiting with Redis

April 21, 2026at 2:00 PM UTCBy Pocket Portfolio TeamTechnology
How to Implement Rate Limiting with Redis
#redis#rate limiting#API#backend

Problem

When building robust APIs, managing the rate at which clients can make requests is crucial to maintaining performance and preventing abuse. Without rate limiting, malicious users or buggy clients can overwhelm your server, leading to degraded service for legitimate users. Redis is a powerful in-memory data structure store that can be effectively used to implement rate limiting.

Solution with Code

Rate limiting can be implemented in Redis using various algorithms such as the token bucket or fixed window counter. Here, we use the sliding window log algorithm, which provides a precise control over request rates.

Step-by-Step Implementation

  1. Setup Redis Client

    Ensure you have Redis installed and running. Connect to your Redis server using a Redis client in your preferred programming language. For our example, we'll use Node.js.

    const redis = require('redis');
    const client = redis.createClient();
    
    client.on('error', (err) => {
      console.error('Error connecting to Redis:', err);
    });
    
    client.connect();
    
  2. Define Rate Limiting Parameters

    Decide on the max number of requests and the time window in which they can occur.

    const MAX_REQUESTS = 100; // Max requests
    const WINDOW_SIZE = 60 * 1000; // Time window in milliseconds (1 minute)
    
  3. Implement the Rate Limiting Logic

    The logic involves recording each request's timestamp in a Redis list and trimming old entries.

    async function isRateLimited(userId) {
      const key = `rate_limit:${userId}`;
      const currentTime = Date.now();
    
      // Record the current request time
      await client.lPush(key, currentTime);
    
      // Remove timestamps outside the time window
      await client.lTrim(key, 0, MAX_REQUESTS - 1);
    
      // Get timestamps to count requests in the window
      const timestamps = await client.lRange(key, 0, -1);
    
      // Check if requests are within the limit
      if (timestamps.length < MAX_REQUESTS) {
        return false; // Not rate limited
      }
    
      // Calculate the time difference between the oldest request and current time
      const oldestRequestTime = parseInt(timestamps[timestamps.length - 1], 10);
      if (currentTime - oldestRequestTime < WINDOW_SIZE) {
        return true; // Rate limited
      }
    
      return false; // Not rate limited
    }
    
  4. Using the Rate Limiting Function

    Use the isRateLimited function to check if a user exceeds the rate limit before processing their request.

    async function handleRequest(userId) {
      if (await isRateLimited(userId)) {
        console.log('Rate limit exceeded');
        // Respond with rate limit error
        return;
      }
    
      console.log('Request processed');
      // Continue processing the request
    }
    

Key Concepts

  • Redis List: Used to store timestamps of requests, allowing efficient push and trim operations to maintain a sliding window.
  • Sliding Window Log: Provides precise rate limiting by maintaining a log of request timestamps and checking if the number of requests exceeds the limit within the specified window.
  • Asynchronous Operations: Since Redis operations are asynchronous, ensure your code handles promises correctly to avoid race conditions.

By implementing the above strategy, you can effectively manage API request rates, ensuring fair usage and protecting your server from potential abuse.

How to Implement Rate Limiting with Redis | Open Portfolio Blog | Open Portfolio