Application manages cache explicitly. On read: check cache, if miss, read from DB, populate cache. On write: update DB, invalidate or update cache.
Pros: only caches what's read, works with any cache. Cons: cache misses hit DB, potential inconsistency window. Most common caching pattern. Redis and Memcached typically used this way.