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