Cache-aside: где именно рвётся согласованность кэша и базы?
В схеме cache-aside приложение само читает из кэша, при промахе идёт в базу и кладёт результат обратно. Разрыв согласованности возникает в двух местах. Первое — гонка чтения и записи: читатель получил из базы старое значение, в этот момент писатель обновил базу и удалил ключ, после чего читатель кладёт в кэш уже устаревшее значение, и оно живёт до истечения TTL. Второе — порядок операций при обновлении: если сначала удалить ключ, а потом писать в базу, между этими шагами параллельное чтение снова наполнит кэш старым значением. Поэтому базовое правило — сначала пишем в базу, потом удаляем ключ (а не обновляем его), и всё равно остаётся окно гонки, которое закрывают коротким TTL, версионированием ключа или отложенным повторным удалением. Полностью согласованный кэш требует другой схемы — инвалидации через журнал изменений базы, а не из кода приложения.