Технический справочник pg_local_cache
pg_local_cache кэширует целые строки по полному первичному ключу в ограниченной
общей памяти PostgreSQL. Расширение предоставляет явную SQL-функцию
local_cache.mget и необязательную конечную точку RESP2.
Обычный SQL остаётся обычным: расширение не устанавливает хуки планировщика или исполнителя. Обычный
SELECTвсегда использует PostgreSQL и никогда не читает этот кэш.
Поддерживаемые таблицы и ключи
Исходные таблицы должны быть постоянными heap-таблицами с действующим первичным ключом, без RLS, секционирования, наследования или владения расширением.
Поддерживаемые типы ключей:
smallint,integerиbigint;text,varcharиcharс детерминированными сортировками;uuid;- составные первичные ключи, состоящие только из этих типов.
Неподдерживаемые отношения отклоняются во время подключения, а не приводят к небезопасному частичному сопоставлению.
Подключение, сверка и отключение таблиц
local_cache.attach_table(regclass) выполняет одну защищённую
последовательность настройки:
- блокирует и проверяет отношение;
- записывает его пространство имён, OID отношения и упорядоченные столбцы первичного ключа;
- устанавливает принадлежащие расширению триггеры уровня оператора, строки и TRUNCATE;
- перезагружает сопоставления воркеров.
Триггеры событий DDL инвалидируют метаданные сопоставления. После намеренных
изменений схемы выполните local_cache.reconcile_table(...) или
local_cache.reconcile_all(). local_cache.detach_table(...) удаляет
сопоставление и его триггеры.
SQL API mget
Сигнатура:
local_cache.mget(relation regclass, key_values anyarray) RETURNS text[]
Для одноколоночных ключей используется собственный тип массива. Для составных
ключей используется прямоугольный text[][]: один ключ на строку и один
компонент на столбец первичного ключа.
Контракт:
- не более 1 024 ключей за вызов;
- порядок входных данных и дубликаты сохраняются;
- входной
NULLи отсутствующие строки дают выровненные результатыNULL; - компоненты составного ключа не могут быть
NULL; - каждый компонент разбирается входной функцией своего типа PostgreSQL;
- весь составной пакет проверяется до первого поиска;
- вызывающим сторонам нужен
SELECTна исходной таблице; - функция работает с правами
SECURITY INVOKER.
Подготовленный запрос к исходной таблице кэшируется для каждого экземпляра функции, пользователя, отношения и поколения сопоставления.
Путь чтения и безопасный обход
Каждый запрошенный ключ проходит один и тот же путь:
- канонизировать полный первичный ключ;
- использовать общий кэш только в чистой транзакции
READ COMMITTEDна доступном для записи основном сервере; - проверить контрольную сумму полезной нагрузки, дескриптор строки, исходный
xminи видимость снимка; - в противном случае выполнить индексированный запрос к исходной таблице через SPI;
- опубликовать положительную или отрицательную запись только после доказательства по последнему снимку.
REPEATABLE READ, SERIALIZABLE, восстановление, параллельное выполнение и
транзакция, записавшая сопоставленные данные, обходят кэш. Строки больше лимита
полезной нагрузки кэша всё равно возвращаются PostgreSQL, но не кэшируются.
Согласованность транзакций
До фиксации записи сопоставленной таблицы триггеры ограждают затронутый ключ или отношение. Заполнение кэша несёт поколения сопоставления, глобальное, отношения, ключа и загрузчика, поэтому устаревший загрузчик не сможет опубликовать результат после инвалидации или вытеснения.
Положительные записи сохраняют xmin исходного кортежа и горизонт наблюдения
FullXID. Записи, недопустимые для текущего снимка, используют PostgreSQL. Для
более старого активного снимка отрицательные записи никогда не считаются
авторитетными.
Откат удаляет локальное состояние транзакции, не публикуя новые данные. Поэтому чтение собственных изменений выполняется через PostgreSQL, а не через предполагаемое содержимое кэша.
Общая память и конфигурация
Записи кэша, состояния отношений, счётчики, поколения воркеров и слоты клиентов RESP выделяются при запуске postmaster. Ёмкость ограничена. При вытеснении выбирается ограниченный вращающийся набор и предпочтение отдаётся устаревшим записям; при отказе в допуске новая запись читается из исходной таблицы вместо неограниченного выделения памяти.
| Параметр | По умолчанию | Значение |
|---|---|---|
pg_local_cache.database |
postgres |
база данных, обслуживаемая расширением |
pg_local_cache.cache_entries |
16384 |
ёмкость общей памяти для строк |
pg_local_cache.relation_states |
1024 |
ёмкость общего состояния сопоставлений |
pg_local_cache.memory_budget_mb |
384 |
бюджет расширения при запуске |
pg_local_cache.port |
6380 |
порт RESP; 0 отключает RESP |
pg_local_cache.bind_address |
127.0.0.1 |
адрес привязки RESP |
pg_local_cache.workers |
4 |
воркеры RESP |
pg_local_cache.role |
local_cache_worker |
роль PostgreSQL для RESP |
pg_local_cache.max_clients |
256 |
глобальный лимит клиентов RESP |
pg_local_cache.max_clients_per_worker |
64 |
слоты на воркер |
pg_local_cache.idle_timeout_ms |
300000 |
крайний срок для простоя и медленного клиента |
pg_local_cache.statement_timeout_ms |
2000 |
крайний срок оператора воркера |
pg_local_cache.lock_timeout_ms |
250 |
крайний срок блокировки воркера |
pg_local_cache.singleflight_wait_ms |
25 |
ожидание подписчика для того же ключа |
pg_local_cache.max_pipeline_commands |
256 |
команд за один оборот цикла событий |
pg_local_cache.max_dirty_keys |
4096 |
ограничение ограждения ключей транзакции |
pg_local_cache.auth_token_file |
пусто | предпочтительный учётный секрет RESP |
pg_local_cache.auth_token |
пусто | встроенный токен только для разработки |
pg_local_cache.allow_superuser |
off |
переопределение роли только для разработки |
Это параметры postmaster. Задайте их до перезапуска; предварительная проверка бинарного установщика проверяет общий план.
Необязательная конечная точка RESP2
RESP2 использует те же сопоставления и общий кэш. Ключи протокола имеют такой вид:
CRUD:database.schema.table:{"pk_column":<json-scalar>,...}
Поддерживаются аутентифицированные ограниченные команды MGET, SET, DEL и
инвалидация в заданной области. Воркеры RESP используют одну настроенную роль
PostgreSQL; они не наследуют ACL базы данных отдельных сетевых клиентов.
У конечной точки нет TLS. Привязывайте её к loopback или размещайте за аутентифицированным TLS-прокси. Предпочитайте файл токена с ограниченными правами вместо встроенного токена.
Состояние и мониторинг
local_cache.health() сообщает о готовности и согласованности сопоставлений.
local_cache.stats() возвращает счётчики в JSON. local_cache.metrics()
предоставляет типизированную строку метрик, используемую экспортёром.
Счётчики SQL-кэша описывают только явные вызовы mget:
sql_cache_hitssql_cache_missessql_cache_fillssql_cache_bypasses
Счётчики чтений базы данных, инвалидации, отклонения допуска, обхода из-за грязных ключей, singleflight, воркеров и RESP остаются отдельными.
Далее используйте руководство по установке, где описаны проверенные бинарные файлы, сборки исходников через PGXS, контролируемые перезапуски, проверка и безопасное восстановление.