惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
腾讯CDC
Vercel News
Vercel News
Recent Announcements
Recent Announcements
博客园 - Franky
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
宝玉的分享
宝玉的分享
I
InfoQ
博客园 - 聂微东
Jina AI
Jina AI
J
Java Code Geeks
V
V2EX
U
Unit 42
Stack Overflow Blog
Stack Overflow Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
L
LangChain Blog
T
The Blog of Author Tim Ferriss
量子位

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Session Management, Rate Limiting & Caching using Redis
Agbo, Daniel Onuoha · 2026-05-31 · via DEV Community

Modern distributed systems — whether fintech APIs, e-commerce platforms, or AI-powered services — share a fundamental challenge: every replica, microservice, and edge device must operate from the same authoritative view of user state. Redis solves this elegantly by serving as a unified, in-memory data layer that provides every node in your system with consistent, sub-millisecond access to sessions, counters, and cached data.

The Core Problem Redis Solves

When you run three replicas of an API behind a load balancer with no shared state layer, you get ghost sessions (user logs in on replica A, hits replica B, gets logged out), double-counting on rate limiters (each replica counts independently), and cache fragmentation (three replicas, three caches, three stale states). Redis eliminates all of this with a single centralized data store that every service reads and writes atomically. Because Redis is fully in-memory, it delivers sub-millisecond response times while still supporting optional persistence, making it suitable as both a hot cache and a durable session store.

Centralized Session Management

Traditional sticky sessions tie users to specific server pods, creating fragile, hard-to-scale systems. Redis-backed sessions decouple user identity from server affinity entirely.

How it works:

  • On login, generate a secure session token (e.g., UUID or signed JWT reference) and write the session payload — user ID, roles, preferences, device info — to Redis with a TTL.
  • On every request, middleware reads the token from the cookie/header and fetches session state from Redis in a single GET call.
  • On logout or token revocation, DEL the key immediately — across all replicas simultaneously.

Reference architecture:

Client → Load Balancer → [API Replica 1 | API Replica 2 | API Replica 3]
                                        ↓
                              Redis Cluster (session store)
                              Key: session:{token}
                              Value: { userId, roles, cart, lastSeen }
                              TTL: 1800s (sliding)

Sessions survive server restarts and are shared across instances without any inter-service communication overhead. For sliding expiration (resetting TTL on activity), use EXPIRE session:{token} 1800 on every authenticated request to keep active users logged in without manual refresh logic.

Consistent Distributed Rate Limiting

Rate limiting is only effective when enforced across your entire fleet — not per replica. Redis atomic operations (INCR, EXPIRE, Lua scripts) make cross-replica rate limiting both correct and fast.

The Five Algorithms at a Glance

Algorithm Redis Structure Best For Trade-off
Fixed Window INCR + EXPIRE Simple per-minute/hour limits Burst allowed at window edges
Sliding Window Log ZADD + ZRANGEBYSCORE Smooth enforcement, audit logs Higher memory per user
Sliding Window Counter Two fixed windows blended Balance of accuracy & memory Slightly approximate
Token Bucket Hash + Lua script API quotas with burst tolerance More complex implementation
Leaky Bucket List as queue Smooth outbound request flow Adds processing latency

Practical implementation (Fixed Window, Node.js): [

async function rateLimit(req, res, next) {
  const key = `rl:${req.ip}:${Math.floor(Date.now() / 60000)}`; // per minute
  const count = await redis.incr(key);
  if (count === 1) await redis.expire(key, 60);
  if (count > 100) return res.status(429).json({ error: 'Rate limit exceeded' });
  next();
}

For high-accuracy sliding windows across replicas, use a Lua script to make the read-increment-expire sequence atomic — critical for preventing race conditions under burst traffic.

Cache Layer That Stays Consistent

Caching in Redis is not just about speed — it is about predictable freshness. The most common pitfall is stale data served long after the source-of-truth has changed.

Cache-Aside Pattern (Most Common)

async function getUser(userId) {
  const cached = await redis.get(`user:${userId}`);
  if (cached) return JSON.parse(cached);

  const user = await db.users.findById(userId);
  await redis.setex(`user:${userId}`, 3600, JSON.stringify(user));
  return user;
}

On writes, explicitly invalidate or update the cache key:

async function updateUser(userId, data) {
  await db.users.update(userId, data);
  await redis.del(`user:${userId}`); // force fresh read on next request
}

Strategies for Avoiding Stale Data

  • Write-through: Write to Redis and DB simultaneously on mutation — cache is never stale, but writes are slightly slower.
  • TTL-based expiry: Set aggressive TTLs (SETEX) for data that changes frequently; set longer TTLs for quasi-static data.
  • Event-driven invalidation: Publish a cache:invalidate:{key} event via Redis Pub/Sub when source data changes; all services subscribe and evict. redis
  • Avoid KEYS * in production — use SCAN for bulk key operations to prevent blocking the event loop.

Operational Settings

# redis.conf
maxmemory 4gb
maxmemory-policy allkeys-lru   # evict least-recently-used when full

This ensures Redis gracefully handles memory pressure rather than refusing writes or crashing.

Handling Traffic Spikes

Traffic spikes — flash sales, viral moments, scheduled batch jobs — are where Redis architecture pays dividends most visibly.

Reference architecture for spike absorption:

Incoming Requests
      ↓
[API Gateway / Load Balancer]
      ↓
[Rate Limiter Middleware]  ←→  Redis (INCR counters, token buckets)
      ↓
[Cache Check]             ←→  Redis (GET/SETEX)
      ↓ (cache miss only)
[Application Layer]
      ↓
[Primary Database]

Key design principles:

  • Cache hot-path data aggressively — product listings, user profiles, config — so the DB only handles cold reads and writes
  • Use Redis pipelines to batch multiple reads/writes in a single round-trip during burst periods
  • Redis Cluster with read replicas distributes read-heavy workloads; writes go to primaries, reads fan out to replicas
  • Circuit breakers should fall back to Redis-only responses (serving slightly stale cache) rather than cascading to a saturated DB

Powering Low-Latency AI Workloads

42.9% of developers rely on Redis for memory and data storage in production AI applications. This is not coincidental — AI inference requires context (conversation history, user preferences, risk scores) delivered at sub-millisecond speeds, which no disk-based database can match.

AI context layer architecture:

User Message
     ↓
[AI Gateway / Orchestrator]
     |
     ├─ GET session:{userId}:context  → Redis (conversation history, last N turns)
     ├─ GET features:{userId}         → Redis (real-time user behavior, risk score)
     ├─ Vector Search                 → Redis (semantic similarity via RediSearch)
     |
     ↓
[LLM / Inference Engine]
     ↓
[Store response] → Redis (append to context, update TTL)
                 → Postgres (async persistence every N turns)

Redis supports vector search natively via RediSearch, meaning you can store embeddings alongside session state and feature data in one system — eliminating the need for a separate vector database and reducing infrastructure complexity.

For AI agents specifically:

  • Use Redis for hot session state when sub-100ms state access is critical and you run 10+ concurrent agent replicas.
  • Combine with a durable database (PostgreSQL) using a hot/cold hybrid — Redis serves reads, Postgres persists writes every N interactions.
  • Never store API keys or secrets inside agent state keys in Redis; use Kubernetes Secrets or AWS Secrets Manager and reference IDs only.

Production Checklist

Before shipping Redis-backed session, rate limiting, or caching to production:

  • Set maxmemory with allkeys-lru eviction policy in all environments
  • Enable Redis persistence (RDB snapshots + AOF logs) for session durability across restarts
  • Use Redis Cluster or Redis Sentinel for HA — never run a single Redis node in production
  • Wrap all multi-step Redis operations (check-then-act) in Lua scripts to guarantee atomicity
  • Monitor memory_fragmentation_ratio, connected_clients, and keyspace_hits/misses via CloudWatch or Prometheus
  • Use connection pooling (ioredis pool in Node.js, or redis-py pool in Python) to avoid connection exhaustion under load
  • Set TTLs on every cache key — never write a key without an expiry

Redis is not just a cache; it is the operational backbone of any system that takes real-time user experience seriously. Whether you are building a fintech platform handling concurrent payment sessions, a marketplace absorbing flash-sale traffic, or an AI assistant that needs to recall context in milliseconds — a well-architected Redis layer is what separates reliable production systems from ones that fail under pressure.