Put a cache-aside layer (Redis/Memcached) in front of the DB so reads hit memory, give entries a TTL and invalidate on write, add stampede protection so a cold key can't unleash a thundering herd on the DB, and spread hot keys across replicas so one popular key doesn't melt a single node.
┌── hit ──▶ return value
request ──▶ cache│
└── miss ─▶ lock ─▶ DB read ─▶ set(TTL) ─▶ return
│
(only ONE miss populates; others wait)
DB writes ──▶ invalidate/update key
