Concept Flow - Cache-aside (lazy loading) deep dive
Request data
Check cache
Return
Store in cache
Return
When data is requested, first check the cache. If found (hit), return it. If not (miss), load from database, store in cache, then return.
1. Request key 'user:1' 2. Check Redis cache 3. If miss, query DB 4. Store DB result in Redis 5. Return data
| Step | Action | Cache State | DB Query | Result Returned |
|---|---|---|---|---|
| 1 | Request 'user:1' | {} | No | No data yet |
| 2 | Check cache for 'user:1' | {} | No | Cache miss |
| 3 | Query DB for 'user:1' | {} | Yes | {id:1, name:'Alice'} |
| 4 | Store '{id:1, name:"Alice"}' in cache | {"user:1": "{id:1, name:\"Alice\"}"} | No | No |
| 5 | Return data from cache | {"user:1": "{id:1, name:\"Alice\"}"} | No | {id:1, name:'Alice'} |
| 6 | Request 'user:1' again | {"user:1": "{id:1, name:\"Alice\"}"} | No | No |
| 7 | Check cache for 'user:1' | {"user:1": "{id:1, name:\"Alice\"}"} | No | Cache hit |
| 8 | Return data from cache | {"user:1": "{id:1, name:\"Alice\"}"} | No | {id:1, name:'Alice'} |
| Variable | Start | After Step 4 | After Step 8 |
|---|---|---|---|
| Cache | {} | {"user:1": "{id:1, name:\"Alice\"}"} | {"user:1": "{id:1, name:\"Alice\"}"} |
| DB Query Count | 0 | 1 | 1 |
| Returned Data | None | {id:1, name:'Alice'} | {id:1, name:'Alice'} |
Cache-aside (lazy loading) pattern: - On data request, check cache first. - If cache miss, load from DB. - Store DB result in cache. - Return data from cache. - Subsequent requests hit cache, avoiding DB. - Improves performance by reducing DB load.