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

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

Явный SQL API · PostgreSQL 14–18 · Открытый исходный код

Измерено локально · 15 сентября 2026

839,678запросов/с · RESP MGET

3.31× пропускной способности подготовленного SQL
в этом сравнении одного ключа

Подготовленный SQL
253,790 запросов/с
SQL mget
186,296 запросов/с
Apple M3 Max · PostgreSQL 16 · Go · 256 соединений.
Прогретый кэш, 1 ключ/запрос. Медиана для 3 × 5 секунд.
Здесь SQL mget оказался медленнее; результаты пакетного чтения отличаются.
Результаты, исходные данные и условия

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

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

psql │ чтение по первичному ключу
-- Attach your table once.
SELECT local_cache.attach_table('public.items');

-- Read rows by primary key.
SELECT local_cache.mget(
  'public.items', ARRAY[42, 7]::bigint[]
);
Путь чтения SQL mget Приложение вызывает local_cache.mget внутри PostgreSQL. После проверки допустимости и снимка попадание в кэш возвращает сохранённую полезную нагрузку всей строки. Промах или обход кэша читает исходную таблицу. Оба пути возвращают строки через одно и то же соединение PostgreSQL. PostgreSQL Приложение local_cache.mget Допустимость + снимок Попадание Промах / обход Сохранённаястрока Исходнаятаблица
Оба пути возвращают сериализованные строки через одно и то же соединение PostgreSQL. Подходящее чтение исходной таблицы может заполнить кэш.
Что предотвращает попадание в кэш строк
SQL mget

До 1 024 ключей за вызов. Порядок, дубликаты и позиции NULL сохраняются.

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

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

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

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

Проверки снимка

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

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

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

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

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

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

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

Оставьте обычный 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 up --build --wait

Прочитайте демонстрационные строки и проверьте попадания в кэш. Уже клонировали репозиторий? Запустите последнюю команду из его корня. Для существующего сервера используйте руководство по установке.

Установка на существующий сервер требует перезапуска PostgreSQL.

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

Запустите pg_local_cache локальноЗапустите pg_local_cache 2.0 во временном PostgreSQL, прочитайте демонстрационные строки, проверьте попадания в кэш, протестируйте обновления и удалите демонстрацию, не меняя существующую базу данных. Бенчмарки кэша PostgreSQLИзмеренные результаты pg_local_cache с Node.js, Go и RESP на Apple M3 Max. Включены машина, CPU PostgreSQL, память и методика. Руководство по выбору кэширования PostgreSQLВыберите кэширование страниц PostgreSQL, подготовленный SQL, кэш целых строк, материализованные представления или внешний кэш в зависимости от работы, которую нужно исключить. Cache-aside для PostgreSQL и RedisИспользуйте PostgreSQL как источник истины с путём cache-aside для Redis, разберитесь с гонками устаревшего чтения и узнайте, какое место занимает pg_local_cache. Пакетное чтение по первичному ключу PostgreSQLЗамените N+1 чтений по первичному ключу одним параметризованным запросом PostgreSQL, при необходимости сохраните входные позиции и сравните явный путь pg_local_cache mget. Кэш строк PostgreSQL в сравнении с shared_buffersСравните кэширование страниц PostgreSQL с кэшированием целых строк pg_local_cache 2.0. Узнайте, какую работу устраняет попадание в кэш строк, какая остаётся и когда не стоит добавлять ещё один кэш. Инвалидация кэша PostgreSQL с учётом транзакцийПротестируйте инвалидацию pg_local_cache 2.0 с параллельными сеансами PostgreSQL. Проверьте незакоммиченные обновления, чтение собственных изменений, откат, зафиксированные чтения и правила обхода. Пакетное чтение строк с node-postgresИспользуйте pg_local_cache 2.0 из Node.js с параметризованным массивом bigint и передачей JSON. Сохраняйте порядок и null, затем сравните результат с подготовленным запросом ANY. Пакетное чтение строк с Go и pgxИспользуйте pg_local_cache из Go с pgx, параметризованными ключами и декодированными строками JSON. Подключение через RESPЧитайте строки PostgreSQL через RESP2 с redis-cli или Node.js. Включены аутентификация, настройки клиента, запускаемые примеры и очистка. Установите pg_local_cache на PostgreSQL 14–18Установите расширение PostgreSQL pg_local_cache с проверенными бинарными файлами Linux или через PGXS, затем настройте preload, перезапустите, проверьте и безопасно восстановите работу. Технический справочник pg_local_cacheТехнический справочник по SQL mget pg_local_cache, инвалидации с учётом транзакций, ограниченной общей памяти PostgreSQL, мониторингу и необязательному RESP2.

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

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

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

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

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

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

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

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

Нет. Кэш SQL используют только явные вызовы local_cache.mget. Ваши существующие запросы сохраняют обычный путь выполнения PostgreSQL.

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

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

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

В руководстве по инвалидации есть тест в двух сеансах. Выполняемый пример проверяет незакоммиченные записи, чтение собственных изменений, откат и зафиксированные обновления.