- .Net Core
- 1
- June-09-2025
- by Ihsan Ullah
What is Caching?
Caching stores a copy of data in a faster storage layer (like memory) so future requests can be served quicker without hitting the database or doing expensive computation again.
๐ง Common Caching Strategies for APIs
1. In-Memory Caching (e.g. Redis, Memcached)
- Best for: High-performance APIs with frequent reads.
- How it works: Data is stored in RAM (like a key-value store).
- Tools: Redis, Memcached
Example:
// Pseudo-code
if (cache.has("user:123")) {
return cache.get("user:123");
}
const user = db.getUser(123);
cache.set("user:123", user);
return user;
2. HTTP Caching (Client-side + CDN)
- Best for: Public APIs and static content (like images, product listings).
- How it works: Uses HTTP headers like
Cache-Control
,ETag
,Expires
to instruct browsers/CDNs to cache. - Tools: CDNs (Cloudflare, Fastly), browsers
Example headers:
Cache-Control: public, max-age=3600
ETag: "abc123"
3. Database Query Result Caching
- Best for: Repeated complex queries with infrequent changes.
- How it works: Cache the result of the DB query in memory (like Redis) and return the cached result if it exists.
4. Application-level Caching
- Store computed results (like filtered lists, analytics) in memory or files.
- Useful when the logic is expensive but doesn’t change often.
5. Persistent Caching
- Saves cached data to disk or a database so it survives app restarts.
- Good for infrequent data changes but high read demand.
6. Stale-While-Revalidate
- Serve stale data immediately, while fetching and updating the cache in the background.
- Keeps responses fast while data stays reasonably fresh.
Libraries: swr in React, custom middleware in Node/Express.
7. Per-User or Per-Session Caching
- Useful for personalized data.
- Cache is scoped to a user or token: e.g., cache.get("user:42:dashboard")
8. Reverse Proxy Caching (e.g. Varnish, Nginx)
- Acts as a cache layer between your app and the outside world.
- Caches whole HTTP responses.
๐ Cache Invalidation (Hard Part)
Caching is fast, but invalidating (updating or removing) stale data is tricky:
- Time-based (TTL): Set expiration time.
- Event-based: Invalidate cache on database change or API call.
- Manual purge: Admins or developers trigger cache clear.
โ Best Practices
- Use cache only where data is relatively stable.
- Set appropriate TTL (time to live).
- Watch out for race conditions or cache poisoning.
- Use tools like Redis with expiry, HTTP caching, and CDNs together.
๐งช Example Stack
For a MERN app:
- Use Redis for backend caching
- Use node-cache or lru-cache for lightweight in-memory cache
- Add Cloudflare/CDN caching on static/public endpoints
- Use ETags for smart HTTP caching