Кэш строк
внутри PostgreSQL.

Читайте строки по первичному ключу через аутентифицированный RESP MGET. Записи PostgreSQL автоматически инвалидируют затронутые элементы кэша.

Аутентифицированный RESP API · PostgreSQL 14–18 · Открытый исходный код

В версии 3.1.0 ёмкость арены измеряется в байтах, что при подходящем бюджете позволяет хранить миллионы небольших ключей. Добавлены секционные блокировки, попадания по одному ключу без аллокаций, дешёвый учёт записей и отложенные промахи при блокировках отношений. Руководство по обновлению.

3.1.0 · финальная сборка c431bcc

210kзапросов/с · RESP MGET

На одно закреплённое физическое ядро
горячие ключи · 256 клиентов · Go/pgx

Valkey · io-threads=2N
91.5k запросов/с
Подготовленный SQL
23.2k запросов/с
Частная сеть 10 Гбит/с · Xeon Gold 6354 · закрепление за одним физическим ядром.
На одном ядре Valkey io-threads=1 достиг 180k запросов/с и расходовал меньше всего CPU сервера на запрос.
Результаты, исходные данные и условия

Один вызов. Два пути чтения.

Подходящее попадание возвращает сохранённую строку. Промах или обход кэша читает исходную таблицу. Ваши обычные запросы SELECT сохраняют существующий путь.

RESP2 │ чтение по первичному ключу
-- 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}
Путь чтения RESP MGET Приложение отправляет аутентифицированную команду RESP MGET. Допустимое попадание возвращает сохранённую полную строку. При промахе или обходе исходная таблица читается с настроенной ролью worker, а строка возвращается через RESP. PostgreSQL Приложение RESP MGET Допустимость + снимок Попадание Промах / обход Сохранённаястрока Исходнаятаблица
Оба пути возвращают полные строки через RESP. Чтение исходной таблицы может заполнить кэш.
Что предотвращает попадание в кэш строк
RESP MGET

Требует аутентификации и ограничен 1 024 ключами за запрос. Для отсутствующих строк возвращается null.

Обычные записи

INSERT, UPDATE и DELETE инвалидируют затронутые записи.

Фиксированная ёмкость

Выделяйте кэш строк в общей памяти при запуске PostgreSQL.

Проверка поколения fence и полезной нагрузки

Недопустимые чтения используют исходную таблицу с учётом правил видимости PostgreSQL.

Запустите один тест.
На каждом клиенте.

Node.js и Go. Подготовленный SQL и RESP MGET.

Один запуск использует одинаковые ключи, размеры пакетов, число соединений, длительность и проверки результатов. Сравнивайте пропускную способность, задержку, а также CPU и память PostgreSQL на своей машине.

Запустить сравнение

Стоит измерить

  • Повторяющиеся полные чтения по первичному ключу.
  • Небольшой горячий набор целых строк.
  • READ COMMITTED на одном доступном для записи основном сервере.
  • Приложение, способное использовать аутентифицированный RESP MGET.

Оставьте обычный SQL

  • Соединения, диапазоны, агрегаты или произвольные результаты запросов.
  • RLS, секционированные или унаследованные таблицы.
  • База данных, в которую нельзя установить нативное расширение.
  • Нагрузки без измеренной выгоды.

Запустите локальную демонстрацию.

Клонируйте репозиторий и запустите временный сервер PostgreSQL с демонстрационными строками. Docker соберёт расширение и отделит демонстрацию от ваших баз данных.

Нужны Git и Docker Compose
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.

Документация

Запустите pg_local_cache локальноЗапустите pg_local_cache 3.1.0 во временном PostgreSQL, читайте демонстрационные строки через RESP, проверяйте попадания в кэш, тестируйте обновления и удаляйте демонстрацию без изменений существующей базы. Установка pg_local_cache на PostgreSQL 14–18Установите проверенный пакет Debian или RPM, используйте PGXN или PGXS, настройте preload, перезапустите PostgreSQL и создайте, обновите или удалите pg_local_cache. Клиенты RESPПодключайте совместимые с Redis клиенты для чтения строк PostgreSQL через RESP2 MGET, аутентификацию по токену и встроенный TLS. Бенчмарки кэша PostgreSQL, 3.1.0Результаты pg_local_cache 3.1.0 на двух машинах: чтение на закреплённых и всех ядрах, запись, чтение во время записи и методика. Технический справочник pg_local_cacheТехнический справочник pg_local_cache: RESP MGET, транзакционно-согласованная инвалидация, ограниченная общая память PostgreSQL и мониторинг. Обновление pg_local_cache до 3.1.0Обновление pg_local_cache с 3.0.0 или 2.x, параметры ёмкости и workers в 3.1, перезапуск и проверка расширения. Руководство по выбору кэширования PostgreSQLСравните кэширование страниц PostgreSQL, подготовленный SQL, кэш целых строк, материализованные представления и Redis по работе, которую позволяет избежать каждый путь чтения. Пакетное чтение по первичному ключу PostgreSQLУзнайте, как избежать N+1 чтений по первичному ключу и пакетно читать целые строки через аутентифицированный RESP MGET. Cache-aside для PostgreSQL и RedisСравните управляемый приложением Redis cache-aside с чтением через RESP в pg_local_cache, включая гонки устаревшего заполнения и инвалидацию при записи. Кэш строк PostgreSQL и shared_buffersСравните кэширование страниц PostgreSQL с кэшированием целых строк в pg_local_cache: какую работу в источнике позволяет избежать этот путь, каковы его затраты и для каких нагрузок подходит обычный SQL. Инвалидация кэша PostgreSQL с учётом транзакцийУзнайте, как триггеры PostgreSQL устанавливают барьеры для чтения строк через RESP при фиксации, откате и параллельном заполнении кэша.

Практические заметки о кэшировании PostgreSQL

Пакетное чтение PostgreSQL без потери порядка и отсутствующих ключей

Замените запросы по одному первичному ключу, сохранив дублирующиеся ID, порядок входных данных, позиции NULL и отсутствующие строки. Сравните ANY, WITH ORDINALITY и RESP MGET.

Читать статью
Все статьи →

Перед началом

Заменяет ли это shared_buffers?

Нет. PostgreSQL кэширует страницы базы данных. Это расширение отдельно кэширует сериализованные целые строки по первичному ключу. См. сравнение путей чтения.

Кэширует ли оно обычные запросы SELECT?

Нет. Общий кэш строк использует только аутентифицированный RESP MGET. Существующие запросы сохраняют обычный путь выполнения PostgreSQL.

Заменяет ли это Redis?

Нет. Конечная точка RESP2 ограничена. Здесь нет универсального набора команд Redis, TTL, pub/sub или распределённой координации. Сравните пути cache-aside для PostgreSQL и Redis.

Как проверить обновления и откат?

Руководство по инвалидации описывает работу триггеров. Руководство по обновлению описывает переход с 3.0.0 на 3.1.0, а также прежнюю миграцию с 2.x.