Cache-aside для PostgreSQL и Redis
В этом руководстве описан Redis cache-aside с PostgreSQL в роли источника истины, гонка заполнения устаревшими данными и способ, которым pg_local_cache инвалидирует данные подключённых строк.
При промахе кэша Redis приложение читает строку из PostgreSQL, возвращает её и сохраняет под ключом приложения. При записи приложение фиксирует данные в PostgreSQL и удаляет ключ Redis. TTL ограничивает время хранения, но не гарантирует актуальность. См. руководство Redis по cache-aside.
Гонка инвалидации
Читатель может загрузить старую строку PostgreSQL, приостановиться, а затем сохранить её после того, как писатель зафиксирует изменения и удалит ключ. Следующий читатель увидит устаревшие данные до истечения срока действия или очередного удаления.
Среди способов устранить эту гонку — отклонять заполнение данными со старой версией базы данных, сериализовать загрузки для одного ключа или публиковать зафиксированные изменения через outbox либо CDC-потребителя. Каждый способ добавляет координацию. Граница позднего заполнения внутри PostgreSQL описана в руководстве по инвалидации с учётом транзакций.
Где используется pg_local_cache
pg_local_cache хранит целые строки по первичному ключу в ограниченной общей памяти PostgreSQL. Приложения запрашивают строки аутентифицированной командой RESP2 MGET; обычный SQL и произвольные результаты запросов этот кэш не используют. Триггеры подключённых таблиц устанавливают барьеры для записей, а если проверки допустимости кэширования не пройдены, чтение выполняется из PostgreSQL.
В отличие от Redis cache-aside, этот путь использует механизм записи базы данных для инвалидации и не использует TTL или общие структуры данных Redis. RESP-воркеры применяют настроенную роль PostgreSQL в отдельных коротких транзакциях. Сведения о подключении и безопасности приведены в разделах о клиентах RESP и техническом справочнике.
Используйте Redis для общих объектов приложения, актуальности с управлением через TTL или структур данных Redis. Используйте pg_local_cache для повторного чтения целых строк по первичному ключу из одной базы PostgreSQL. При сочетании этих уровней задавайте для них отдельные ключи, инвалидацию и мониторинг.
Обновлено .