Course contentsShow
← Databases & SQL
Lesson 1247 of 1,95311. NoSQL and Document ModelsFree lesson

Optimizing for Low-Latency Reads

Utilize caching patterns in front of document stores for high-frequency keys.

Optimizing for Low-Latency Reads

In this lesson, you will learn how to reduce response times for your most frequent document queries by implementing an "in-memory caching" layer in front of your primary document store.

The Problem: When Disk Access Isn't Fast Enough

Even with efficient indexing, document stores primarily read from disk. For high-frequency keys—such as a user’s profile data, a current session token, or a trending configuration object—the latency cost of reaching the database for every request can become a bottleneck. If thousands of requests hit the same document simultaneously, you are wasting IOPS on data that rarely changes.

The Solution: The Cache-Aside Pattern

To achieve sub-millisecond reads, we introduce a fast, in-memory key-value store (like Redis or Memcached) between your application and the document database. This is known as the cache-aside pattern.

When your application needs a document:

  1. It checks the cache first using the key.
  2. If found (a cache hit), the application returns the data immediately.
  3. If not found (a cache miss), the application fetches the document from the database, saves a copy in the cache, and then returns the data.

Implementation Concept

Consider a user profile lookup. Instead of querying your document store every time, you manage the data flow like this:

async function getUserProfile(userId) {
  // 1. Try cache
  const cachedData = await cache.get(`user:${userId}`);
  if (cachedData) return JSON.parse(cachedData);

  // 2. Cache miss: fetch from document store
  const user = await db.collection('users').findOne({ _id: userId });

  // 3. Populate cache for future requests
  if (user) {
    await cache.set(`user:${userId}`, JSON.stringify(user), 'EX', 3600); // 1hr TTL
  }
  
  return user;
}

By caching the document, you offload the document engine from handling repetitive "hot" reads. You also save on CPU cycles and network overhead, allowing the primary document store to focus its resources on more complex queries or write operations. Remember to set a Time-To-Live (TTL) on cached items to ensure that data eventually refreshes, preventing your cache from serving stale information indefinitely.

Key Takeaway: By placing an in-memory cache in front of your document store, you shield the primary database from high-frequency read traffic, ensuring your application remains performant even under heavy load.