Инвалидация кэша PostgreSQL: гонка позднего заполнения
Разберите гонку cache-aside, когда старое чтение повторно заполняет удалённый ключ после коммита. Узнайте об ограждении публикации, снимках, откате и кэшах на уровне запроса.
Читать статьюЧитайте строки по первичному ключу через аутентифицированный RESP MGET. Записи PostgreSQL автоматически инвалидируют затронутые элементы кэша.
Аутентифицированный RESP API · PostgreSQL 14–18 · Открытый исходный код
В версии 3.1.0 ёмкость арены измеряется в байтах, что при подходящем бюджете позволяет хранить миллионы небольших ключей. Добавлены секционные блокировки, попадания по одному ключу без аллокаций, дешёвый учёт записей и отложенные промахи при блокировках отношений. Руководство по обновлению.
3.1.0 · финальная сборка c431bcc
210kзапросов/с · RESP MGET
На одно закреплённое физическое ядро
горячие ключи · 256 клиентов · Go/pgx
Подходящее попадание возвращает сохранённую строку. Промах или обход кэша читает исходную таблицу. Ваши обычные запросы SELECT сохраняют существующий путь.
-- Attach your table once.
SELECT local_cache.attach_table('public.items');
-- Read rows by primary key.
MGET CRUD:pglc_demo.public.items:{"id":42} CRUD:pglc_demo.public.items:{"id":7}
Требует аутентификации и ограничен 1 024 ключами за запрос. Для отсутствующих строк возвращается null.
INSERT, UPDATE и DELETE инвалидируют затронутые записи.
Выделяйте кэш строк в общей памяти при запуске PostgreSQL.
Недопустимые чтения используют исходную таблицу с учётом правил видимости PostgreSQL.
Node.js и Go. Подготовленный SQL и RESP MGET.
Один запуск использует одинаковые ключи, размеры пакетов, число соединений, длительность и проверки результатов. Сравнивайте пропускную способность, задержку, а также CPU и память PostgreSQL на своей машине.
Запустить сравнениеВыбираете кэш? Сравните страницы PostgreSQL, строки, материализованные представления и Redis.
Клонируйте репозиторий и запустите временный сервер PostgreSQL с демонстрационными строками. Docker соберёт расширение и отделит демонстрацию от ваших баз данных.
git clone https://github.com/profundium/pg_local_cache.git
cd pg_local_cache
docker compose -f examples/compose.yaml -f examples/compose.resp.yaml up --build --wait
Прочитайте демонстрационные строки и проверьте попадания в кэш. Уже клонировали репозиторий? Запустите последнюю команду из его корня. Для существующего сервера используйте руководство по установке.
Установка на существующий сервер требует перезапуска PostgreSQL.
Разберите гонку cache-aside, когда старое чтение повторно заполняет удалённый ключ после коммита. Узнайте об ограждении публикации, снимках, откате и кэшах на уровне запроса.
Читать статьюСпроектируйте честное сравнение кэша строк PostgreSQL с подготовленным SQL и RESP MGET. Раздельно измеряйте прогретые чтения, промахи, размеры пакетов, записи и затраты клиента.
Читать статьюЗамените запросы по одному первичному ключу, сохранив дублирующиеся ID, порядок входных данных, позиции NULL и отсутствующие строки. Сравните ANY, WITH ORDINALITY и RESP MGET.
Читать статьюpg_local_cache 3.1.0 хранит горячие строки в общей памяти PostgreSQL и отдаёт их по RESP. Сравнение с Valkey и prepared SQL, без устаревших строк.
Читать статьюНет. PostgreSQL кэширует страницы базы данных. Это расширение отдельно кэширует сериализованные целые строки по первичному ключу. См. сравнение путей чтения.
Нет. Общий кэш строк использует только аутентифицированный RESP MGET. Существующие запросы сохраняют обычный путь выполнения PostgreSQL.
Нет. Конечная точка RESP2 ограничена. Здесь нет универсального набора команд Redis, TTL, pub/sub или распределённой координации. Сравните пути cache-aside для PostgreSQL и Redis.
Руководство по инвалидации описывает работу триггеров. Руководство по обновлению описывает переход с 3.0.0 на 3.1.0, а также прежнюю миграцию с 2.x.