Короткий ответ
Cache-aside — приложение само читает из кеша, при промахе идёт в БД и кладёт результат в кеш; write-through — запись сразу идёт и в БД, и в кеш синхронно в рамках одной операции обновления.
Как это работает подробнее
При cache-aside кеш заполняется лениво по факту чтения, инвалидация — отдельный шаг при записи; при write-through обновление кеша встроено в транзакцию записи, и кеш никогда не «пустой» для изменённых данных.
Пример кода
example.py
# cache-aside
def get_user(user_id):
data = cache.get(key(user_id))
if data is None:
data = db.get_user(user_id)
cache.set(key(user_id), data, ex=300)
return data
# write-through
def update_user(user_id, fields):
db.update_user(user_id, fields)
cache.set(key(user_id), db.get_user(user_id), ex=300)Что использовать на практике
- Практика. Cache-aside выбирают, когда читаемые данные — лишь часть всех данных; write-through — когда критична согласованность кеша сразу после записи и профиль чтения предсказуем.
Подводные камни
- Риск. При cache-aside забывать инвалидировать кеш при записи; при write-through не обрабатывать сбой записи в кеш как некритичную ошибку — запись в БД должна проходить, даже если кеш временно недоступен.