system-design-primer/resources/noat.cards/Cache-aside.md

1.5 KiB

+++ noatcards = True isdraft = False +++

Cache-aside

Introduction

Source: From cache to in-memory data grid

The application is responsible for reading and writing from storage. The cache does not interact with storage directly. The application does the following:

  • Look for entry in cache, resulting in a cache miss
  • Load entry from the database
  • Add entry to cache
  • Return entry
def get_user(self, user_id) :
    user = cache.get("user.{0}", user_id) 
    if user is None:
        user = db.query("SELECT * FROM users WHERE user_id = {0}", user_id) 
        if user is not None:
            cache.set(key, json.dumps(user))
    return user

Memcached is generally used in this manner.

Subsequent reads of data added to cache are fast. Cache-aside is also referred to as lazy loading. Only requested data is cached, which avoids filling up the cache with data that isn't requested.

Disadvantage(s) : cache-aside

  • Each cache miss results in three trips, which can cause a noticeable delay.
  • Data can become stale if it is updated in the database. This issue is mitigated by setting a time-to-live (TTL) which forces an update of the cache entry, or by using write-through.
  • When a node fails, it is replaced by a new, empty node, increasing latency.