{"type":"excalidraw","version":2,"source":"https://AwesomeSystemDesign.dev","elements":[{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-1"}],"updated":0,"link":null,"locked":false,"id":"shape-0","type":"rectangle","seed":41,"x":16,"y":16,"width":288,"height":808.2,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-1","type":"text","seed":114,"x":36,"y":34,"width":248,"height":772.2,"fontSize":22,"fontFamily":1,"text":"Cache-Aside (Lazy\nLoading) — Most\nCommon\n\nApp --GET--> Cache\n--HIT--> return\n\nMISS\n\nv\nApp --query--> DB\n--result--> App\n--SET--> Cache\n\n✅ Only caches data\nthat's actually\nrequested\n✅ Cache failure\ndoesn't break the\nsystem (falls back\nto DB)\n❌ Cache miss penalty\n(3 round trips: cache\n+ DB + cache set)\n❌ Stale data until\nTTL expires or\nexplicit invalidation","originalText":"Cache-Aside (Lazy\nLoading) — Most\nCommon\n\nApp --GET--> Cache\n--HIT--> return\n\nMISS\n\nv\nApp --query--> DB\n--result--> App\n--SET--> Cache\n\n✅ Only caches data\nthat's actually\nrequested\n✅ Cache failure\ndoesn't break the\nsystem (falls back\nto DB)\n❌ Cache miss penalty\n(3 round trips: cache\n+ DB + cache set)\n❌ Stale data until\nTTL expires or\nexplicit invalidation","textAlign":"left","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-3"}],"updated":0,"link":null,"locked":false,"id":"shape-2","type":"rectangle","seed":187,"x":16,"y":868.2,"width":288,"height":808.2,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-3","type":"text","seed":260,"x":36,"y":886.2,"width":248,"height":772.2,"fontSize":22,"fontFamily":1,"text":"Read-Through\n\nApp --GET--> Cache\n--HIT--> return\n\nMISS\n\nCache fetches from\nDB itself (cache\nlibrary handles it)\n\nv\nCache --query--> DB\n--result--> Cache\n--return--> App\n\n✅ Simpler application\ncode (cache handles\nmisses)\n✅ Consistent loading\nlogic\n❌ Cache library must\nknow how to query\nDB\n❌ First request for\nnew data is always\nslow","originalText":"Read-Through\n\nApp --GET--> Cache\n--HIT--> return\n\nMISS\n\nCache fetches from\nDB itself (cache\nlibrary handles it)\n\nv\nCache --query--> DB\n--result--> Cache\n--return--> App\n\n✅ Simpler application\ncode (cache handles\nmisses)\n✅ Consistent loading\nlogic\n❌ Cache library must\nknow how to query\nDB\n❌ First request for\nnew data is always\nslow","textAlign":"left","verticalAlign":"middle","containerId":"shape-2","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-5"}],"updated":0,"link":null,"locked":false,"id":"shape-4","type":"rectangle","seed":333,"x":16,"y":1720.4,"width":288,"height":522.2,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-5","type":"text","seed":406,"x":36,"y":1738.4,"width":248,"height":486.2,"fontSize":22,"fontFamily":1,"text":"Write-Through\n\nApp --write--> Cache\n--write--> DB\n--ACK--> Cache\n--ACK--> App\n\n✅ Cache always has\nfresh data\n✅ No stale reads\nafter writes\n❌ Write latency\nincreases (cache +\nDB on write path)\n❌ Caches data that\nmay never be read\n(wasted memory)","originalText":"Write-Through\n\nApp --write--> Cache\n--write--> DB\n--ACK--> Cache\n--ACK--> App\n\n✅ Cache always has\nfresh data\n✅ No stale reads\nafter writes\n❌ Write latency\nincreases (cache +\nDB on write path)\n❌ Caches data that\nmay never be read\n(wasted memory)","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-4"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-7"}],"updated":0,"link":null,"locked":false,"id":"shape-6","type":"rectangle","seed":479,"x":16,"y":2286.6000000000004,"width":288,"height":722.4,"customData":{"revealStep":4}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-4"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-7","type":"text","seed":552,"x":36,"y":2304.6000000000004,"width":248,"height":686.4,"fontSize":22,"fontFamily":1,"text":"Write-Behind\n(Write-Back)\n\nApp --write--> Cache\n--ACK--> App\n\n(async, batched)\n\nv\nBackground worker\n--batch write--> DB\n\n✅ Fastest writes\n(cache ACK is\ninstant)\n✅ DB writes batched\nand optimized\n❌ Data loss if cache\nnode dies before\nflush\n❌ Complex — need\nreliable queue\nbetween cache and\nDB","originalText":"Write-Behind\n(Write-Back)\n\nApp --write--> Cache\n--ACK--> App\n\n(async, batched)\n\nv\nBackground worker\n--batch write--> DB\n\n✅ Fastest writes\n(cache ACK is\ninstant)\n✅ DB writes batched\nand optimized\n❌ Data loss if cache\nnode dies before\nflush\n❌ Complex — need\nreliable queue\nbetween cache and\nDB","textAlign":"left","verticalAlign":"middle","containerId":"shape-6","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":4}},{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-5"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-9"}],"updated":0,"link":null,"locked":false,"id":"shape-8","type":"rectangle","seed":625,"x":16,"y":3053.0000000000005,"width":288,"height":693.8000000000001,"customData":{"revealStep":5}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-5"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-9","type":"text","seed":698,"x":36,"y":3071.0000000000005,"width":248,"height":657.8000000000001,"fontSize":22,"fontFamily":1,"text":"Refresh-Ahead\n(Predictive)\n\nBackground thread\nmonitors keys\napproaching TTL\nexpiry\n→ Proactively\nrefreshes from DB\nBEFORE they expire\n→ User never sees a\ncache miss\n\n✅ Zero cache-miss\nlatency for\npredictable access\npatterns\n❌ Wasted refreshes\nfor keys nobody\naccesses again\n❌ Complex — need\naccess frequency\ntracking","originalText":"Refresh-Ahead\n(Predictive)\n\nBackground thread\nmonitors keys\napproaching TTL\nexpiry\n→ Proactively\nrefreshes from DB\nBEFORE they expire\n→ User never sees a\ncache miss\n\n✅ Zero cache-miss\nlatency for\npredictable access\npatterns\n❌ Wasted refreshes\nfor keys nobody\naccesses again\n❌ Complex — need\naccess frequency\ntracking","textAlign":"left","verticalAlign":"middle","containerId":"shape-8","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":5}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}