Redis session storage cheatsheet.
Pattern
session:<id> → JSON or hash { user_id, exp, csrf }
import secrets
def create_session(user_id):
sid = secrets.token_urlsafe(32)
redis.setex(f"session:{sid}", 86400 * 7, json.dumps({"user_id": user_id}))
return sid
def get_session(sid):
raw = redis.get(f"session:{sid}")
return json.loads(raw) if raw else None
def revoke(sid):
redis.delete(f"session:{sid}")
Hash storage (richer)
def create_session(user_id):
sid = secrets.token_urlsafe(32)
redis.hset(f"session:{sid}", mapping={
"user_id": user_id,
"created": time.time(),
"ip": request.ip,
})
redis.expire(f"session:{sid}", 86400 * 7)
return sid
Sliding expiration
def touch_session(sid, ttl=86400 * 7):
redis.expire(f"session:{sid}", ttl)
Call on each request.
User → sessions index
def create_session(user_id):
sid = secrets.token_urlsafe(32)
redis.setex(f"session:{sid}", 86400 * 7, user_id)
redis.sadd(f"user_sessions:{user_id}", sid)
return sid
def revoke_all(user_id):
sids = redis.smembers(f"user_sessions:{user_id}")
if sids:
redis.unlink(*[f"session:{s}" for s in sids], f"user_sessions:{user_id}")
For “log out everywhere”.
Cookie
response.set_cookie(
"session",
sid,
httponly=True,
secure=True,
samesite="lax",
max_age=86400 * 7,
)
Token rotation
On privilege escalation (login, role change): issue new sid, delete old.
def rotate_session(old_sid, user_id):
new_sid = create_session(user_id)
redis.delete(f"session:{old_sid}")
return new_sid
Anti-fixation
Always rotate sid after login.
CSRF token
def csrf_token(sid):
token = redis.hget(f"session:{sid}", "csrf")
if not token:
token = secrets.token_urlsafe(32)
redis.hset(f"session:{sid}", "csrf", token)
return token
Cluster note
Use hash tag for related keys to stay on same shard:
{user:1}:session
{user:1}:perms
Memory size
Sessions are tiny. Even 1M sessions of 1KB = 1GB. Plan accordingly.
Common mistakes
- Storing too much in session.
- No TTL → memory leak.
- Predictable session IDs (use
secrets). - Not rotating on login.
- Cookie without
Secure/HttpOnly.
Read this next
If you want my session store, it’s at rajpoot.dev .
Building something AI-, backend-, or data-heavy and want a second pair of eyes? I do consulting and freelance work — see my projects and ways to reach me at rajpoot.dev .