Trung BìnhRedis iconRedis

Redis Sorted Set: cách implement leaderboard real-time và sliding window rate limiter?

Leaderboard:

bash
ZADD leaderboard 9500 'alice'   # alice: 9500 điểm
ZADD leaderboard 8200 'bob'
ZRANGE leaderboard 0 9 REV WITHSCORES  # top 10 giảm dần
ZRANK leaderboard 'alice'               # rank của alice
ZINCRBY leaderboard 100 'alice'         # tăng 100 điểm

O(log N) cho mỗi update. Sliding Window Rate Limiter dùng Sorted Set:

python
# Key: ratelimit:user123, score = timestamp, member = unique_id
# (pseudocode - wrap in Lua script for atomicity in production)
ZADD ratelimit:user123 now() uuid()
ZREMRANGEBYSCORE ratelimit:user123 0 (now() - window)
count = ZCARD ratelimit:user123
if count > limit: reject
EXPIRE ratelimit:user123 window

Tất cả thao tác này cần wrap trong Lua script để atomic.

  • So với Fixed Window: Sliding Window chính xác hơn, không có boundary spike.
  • Nhược điểm: tốn memory hơn (lưu timestamp từng request) — dùng ZSET với member là timestamp+uuid.

Xem toàn bộ Redis cùng filter theo level & chủ đề con.

Mở danh sách Redis