Cache-Aside Pattern
The most common caching pattern — application checks cache first, falls back to database on miss:
# Pseudocode
function getUser(id):
cached = redis.get("user:" + id)
if cached:
return deserialize(cached)
user = db.query("SELECT * FROM users WHERE id = ?", id)
redis.setex("user:" + id, 3600, serialize(user))
return userWrite-Through Cache
Update cache immediately when writing to database:
function updateUser(id, data):
db.query("UPDATE users SET ... WHERE id = ?", id)
redis.setex("user:" + id, 3600, serialize(data))Cache Invalidation
# Delete specific key
redis.delete("user:42")
# Delete by pattern
redis-cli --scan --pattern "user:*" | xargs redis-cli DEL
# Use TTL for automatic expiry
redis.setex("popular_posts", 300, data) # 5 minutesSession Storage
# PHP — use Redis for sessions
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"Full Page Caching
# Cache entire HTML responses
key = "page:" + request.url
cached = redis.get(key)
if cached:
return cached
html = render_page()
redis.setex(key, 600, html) # 10 minutes
return htmlMonitoring Cache Effectiveness
redis-cli INFO stats | grep -E "keyspace_hits|keyspace_misses"
# Calculate hit rate: hits / (hits + misses) * 100
# Aim for 90%+ hit rate