Ответ 1
Аннулирование кэша на этапе обновления является жизнеспособным подходом и в прошлом использовалось крайне редко.
У вас есть два варианта, когда происходит ОБНОВЛЕНИЕ:
- Вы можете попытаться установить новое значение во время операции обновления или
- Просто удалите старый и обновите во время операции чтения.
Если вам нужен LRU-кеш, тогда UPDATE может просто удалить старое значение, и при первом получении объекта вы создадите его снова после чтения из реальной базы данных. Однако, если вы знаете, что ваш кэш очень мал, и вы используете другую основную базу данных для задач, отличных от размера данных, вы можете обновить непосредственно во время ОБНОВЛЕНИЯ.
Однако всего этого недостаточно, чтобы быть полностью последовательным.
Когда вы пишете в свою БД, кеш Redis
может быть недоступен, например, в течение нескольких секунд, поэтому данные между ними не синхронизируются.
Что вы делаете в этом случае?
Есть несколько вариантов, которые вы можете использовать одновременно.
- В любом случае установите TTL, чтобы в конечном итоге поврежденные данные обновлялись.
- Используйте ленивый читательский ремонт. Когда вы читаете из БД, время от времени проверяйте у основного, соответствует ли значение. Если нет, обновите кэшированный элемент (или удалите его).
- Используйте эпохи или аналогичные способы доступа к вашим данным. Не всегда возможно, однако иногда вы получаете доступ к кэшированным данным о данном объекте. Когда это возможно, вы можете изменять идентификатор объекта/дескриптор каждый раз, когда изменяете его, поэтому невозможно получить доступ к устаревшим данным в кэше: каждое имя ключа относится к определенной версии вашего объекта.
Таким образом, del-cache-on-update и write-cache-on-read - это базовая стратегия, но вы можете использовать другие дополнительные системы для устранения несоответствий.
На самом деле есть другая опция вместо использования вышеуказанных опций, которая заключается в фоновом процессе, использующем Redis SCAN
для проверки ключ за ключом, если есть несоответствия. Этот процесс может быть медленным и работать с копией вашей базы данных.
Как вы можете видеть, основная идея всегда одна и та же: если обновление кеша завершится неудачно, не делайте его постоянной проблемой, которая может остаться там навсегда, дайте ей возможность исправить себя позже.