Implementing Rate Limiting with Redis

Overview

Implement per-user rate limiting using Redis and the token bucket algorithm.

Prerequisites

  • Redis server running
  • Redis client library for your language

Implementation

1. Token Bucket Algorithm

import redis
import time

class RateLimiter:
    def __init__(self, redis_client, capacity=10, refill_rate=1):
        self.redis = redis_client
        self.capacity = capacity
        self.refill_rate = refill_rate
    
    def allow_request(self, user_id):
        key = f"rate_limit:{user_id}"
        now = time.time()
        
        pipe = self.redis.pipeline()
        pipe.hgetall(key)
        result = pipe.execute()[0]
        
        if not result:
            # First request
            self.redis.hset(key, mapping={
                'tokens': self.capacity - 1,
                'last_refill': now
            })
            self.redis.expire(key, 3600)
            return True
        
        tokens = float(result[b'tokens'])
        last_refill = float(result[b'last_refill'])
        
        # Refill tokens
        elapsed = now - last_refill
        tokens = min(self.capacity, tokens + elapsed * self.refill_rate)
        
        if tokens >= 1:
            self.redis.hset(key, mapping={
                'tokens': tokens - 1,
                'last_refill': now
            })
            return True
        
        return False

2. Usage

redis_client = redis.Redis(host='localhost', port=6379)
limiter = RateLimiter(redis_client, capacity=100, refill_rate=10)

if limiter.allow_request(user_id):
    # Process request
    pass
else:
    # Return 429 Too Many Requests
    pass

Testing

# Check Redis keys
redis-cli KEYS "rate_limit:*"

# Inspect specific user
redis-cli HGETALL "rate_limit:user123"

Advertisement