Снижает нагрузку чтения на Redis или Valkey, когда небольшая группа ключей доминирует в трафике.
Slizen — самостоятельно развёртываемый одноузловой RESP-прокси. Он выявляет горячие ключи, помещает их в ограниченный локальный кэш и объединяет одновременные запросы при промахе кэша. Redis или Valkey остаётся источником истины.
v0.2.3-rc.1, skew-99/1: 94 961 прямой физический GET к источнику против 759
через Slizen на 100 000 операций (на 99,2% меньше), без ошибок и расхождений.
Прямой p99 был ниже: 1,53 мс против 2,05 мс.
Методика ·
Данные релиза
Предварительная версия для разработчиков. Slizen подходит, когда снижение нагрузки на источник важнее дополнительной задержки прокси. Он не предназначен для Redis Cluster, аварийного переключения через Sentinel, широкой совместимости с командами Redis и нагрузок, в которых прямые записи в источник должны становиться видимыми немедленно.
Статус релиза: v0.2.2 — стабильная предварительная версия для разработчиков.
v0.2.3-rc.1 — prerelease для тестирования в staging: текущий исходный код соответствует v0.2.3-rc.1.
Warning
В v0.2 нет аутентификации и TLS на входящем RESP-соединении, TLS для подключения к источнику и встроенной аутентификации Admin API. Все сетевые соединения Slizen должны оставаться приватными.
flowchart LR
App["Клиент Redis"] --> Slizen["RESP-прокси Slizen :6380"]
Slizen --> Cache["Ограниченный локальный кэш"]
Slizen --> Hotness["Трекер горячих ключей"]
Slizen --> Redis["Redis или Valkey — источник истины"]
Admin["Admin API :9090"] --> Slizen
Prom["Prometheus"] --> Admin
Для демонстрации нужен Docker Compose. Она запускает временный экземпляр Valkey
и Slizen в режиме cache, проверяет служебные эндпоинты и выполняет короткую
нагрузку с горячими ключами.
git clone https://github.com/slizendb/slizen.git
cd slizen
make demo
curl http://127.0.0.1:9090/v1/status
make demo-downValkey доступен на 127.0.0.1:6379, RESP-прокси Slizen — на
127.0.0.1:6380, а Admin API — на 127.0.0.1:9090.
В образе ниже находится проверенная версия v0.2.2. Она запускается в режиме
observe: все чтения продолжают поступать в Redis или Valkey, а Slizen
собирает ограниченную телеметрию горячих ключей.
export SLIZEN_IMAGE=ghcr.io/slizendb/slizen@sha256:7989b6ff17659b3f1b2f1d3feec8af6422b48f1f5486eb77247a5c82ba86b627
docker pull "$SLIZEN_IMAGE"
docker run --rm \
--add-host=host.docker.internal:host-gateway \
-p 127.0.0.1:6380:6380 \
-p 127.0.0.1:9090:9090 \
-e SLIZEN_MODE=observe \
-e SLIZEN_PROXY_LISTEN=0.0.0.0:6380 \
-e SLIZEN_ADMIN_LISTEN=0.0.0.0:9090 \
-e SLIZEN_UPSTREAM_ADDRESS=host.docker.internal:6379 \
"$SLIZEN_IMAGE"redis-cli -p 6380 GET an-existing-key
curl http://127.0.0.1:9090/v1/status
curl http://127.0.0.1:9090/v1/hotkeysУчётные данные, лимиты и все переменные окружения описаны в документации по конфигурации.
По умолчанию Slizen запускается в режиме observe. Доступны три режима
политики:
deny: передавать запросы без кэширования и отслеживания горячих ключей; это не механизм ACL.observe: отслеживать горячие ключи, но всегда читать из источника.cache: помещать горячие ключи в локальный кэш в пределах явно заданных ограничений размера и TTL.
Правила используют буквальное, чувствительное к регистру сопоставление по
самому длинному префиксу. В примере ниже основной трафик остаётся в observe,
отслеживание сессий отключено, а один префикс каталога кэшируется:
mode = "cache"
[[cache.policies]]
prefix = ""
mode = "observe"
[[cache.policies]]
prefix = "session:"
mode = "deny"
[[cache.policies]]
prefix = "catalog:featured:"
mode = "cache"
max_item_bytes = 1048576
max_local_ttl = "10s"Глобальный mode = "observe" служит ограничителем безопасности: подходящие
правила cache не могут его переопределить. Количество политик, длина
префиксов, число отслеживаемых ключей, количество и объём записей кэша, размер
элемента и локальный TTL ограничены. Полный контракт приведён в
документации по конфигурации и
ADR 0004.
v0.2 поддерживает небольшой набор команд Redis:
| Команды | Поведение |
|---|---|
GET, MGET |
Используют кэш в режиме cache; в observe всегда передаются источнику. |
SET, SETEX, PSETEX, DEL, UNLINK, EXPIRE, PEXPIRE, PERSIST |
Передаются источнику и инвалидируют связанное локальное состояние. |
TTL, PTTL, EXISTS |
Передаются источнику. |
PING |
Обрабатывается Slizen. |
SELECT 0 |
Принимается как no-op. Остальные базы данных не поддерживаются. |
Транзакции, pub/sub, MONITOR, блокирующие команды |
Отклоняются. |
| Команды, не перечисленные выше | Отклоняются. |
Некоторые поддерживаемые команды принимают меньше вариантов аргументов, чем Redis. Перед изменением адреса в приложении проверьте контракт совместимости. Исходный код v0.2.3 также позволяет проверить список команд:
go run ./cmd/slizenctl compatibility report --output json --accept-limitations GET MGET SET TTL
go run ./cmd/slizenctl compatibility report --output json GET EVALОтчёт описывает возможности исполняемого файла и не анализирует трафик приложения. Различия между версиями описаны в примечаниях к выпускам v0.2.2 и v0.2.3-rc.1.
Поддерживаемые операции записи безопаснее всего направлять через Slizen: в этом случае он инвалидирует связанное локальное состояние. Прямые записи в Redis или Valkey могут оставаться устаревшими в Slizen до истечения локального TTL.
Состояние кэша и трекера горячих ключей не сохраняется. По умолчанию во время
сбоя источника Slizen не возвращает устаревшие значения. Режим observe
никогда не сохраняет и не возвращает локальные значения.
Начните с 30-минутной установки в режиме observe, затем используйте инструкцию по staging. В репозитории есть observe-first sidecar и самостоятельный Helm chart.
Chart создаёт NetworkPolicy, по умолчанию запрещающую входящий трафик. Разрешите
доступ только нужным приложениям и системам мониторинга. Каждый Pod владеет
независимым кэшем; v0.2 не рассылает инвалидации между репликами. Перед
тестированием режима cache прочитайте
контракт поведения при сбоях.
make validate-k8s- Соединения RESP и с источником должны оставаться приватными. v0.2 не поддерживает аутентификацию RESP или TLS и не может подключиться к источнику, требующему TLS.
- RESP listener должен быть привязан к loopback либо доступен только указанным клиентам через NetworkPolicy, по умолчанию запрещающую трафик.
- Перед развёртыванием проверьте инициализацию клиента. Клиенты, которые
автоматически отправляют
AUTH, требуют TLS либо зависят от неподдерживаемых вариантовHELLOилиCLIENT, могут не работать. - Admin API не имеет аутентификации и по умолчанию слушает
127.0.0.1:9090. - Значения не попадают в логи, метрики или Admin API. Идентификаторы горячих ключей по умолчанию вычисляются через HMAC-SHA256, а ключи Redis никогда не используются как метки Prometheus.
Перед тестированием прочитайте модель угроз и документацию по конфигурации.
curl http://127.0.0.1:9090/healthz
curl http://127.0.0.1:9090/readyz
curl http://127.0.0.1:9090/v1/status
curl http://127.0.0.1:9090/v1/hotkeys
curl http://127.0.0.1:9090/v1/audit
curl http://127.0.0.1:9090/v1/cache
curl http://127.0.0.1:9090/metrics/v1/audit возвращает ограниченный список рекомендаций по горячим ключам со
стабильными кодами причин. telemetry_complete=false означает, что отчёт
неполон из-за заданного лимита, ёмкости трекера, вытеснения записи или
ограничения длины ключа.
В репозитории есть дашборд Grafana и правила Prometheus для
staging. Для измерения физического количества команд в
источнике используйте INFO commandstats Redis или Valkey либо экспортёр на
стороне источника.
Кэш можно очистить целиком или для конкретного ключа:
go run ./cmd/slizenctl cache purge --admin http://127.0.0.1:9090
go run ./cmd/slizenctl cache purge --key product:iphone_17 --admin http://127.0.0.1:9090Для выпуска v0.2.3-rc.1 выполнены четыре изолированных теста по 100 000
операций. Опубликованный образ сократил физическое количество команд GET в
источнике на 97,5–99,2% без ошибок запросов, расхождений значений и ошибок
проверки. Прямой доступ к Redis или Valkey показал меньший p99 во всех
сценариях. Это результат по снижению нагрузки на источник, а не обещание
ускорить каждый запрос с помощью прокси.
Более ранний артефакт v0.2.2 зафиксировал на 89,8% меньше логических вызовов
GET к источнику в тесте с 1 000 ключей и неравномерным распределением. В нём
не собирались commandstats источника, поэтому это не доказательство
физического количества сетевых команд. См.
исходный результат v0.2.2
и методику тестирования.
Локальное воспроизведение нагрузки:
make demo-up
make benchmark
make benchmark-workload
make demo-reportРезультаты зависят от оборудования, конфигурации, распределения ключей и
поведения клиента. Перед включением режима cache проведите измерения на своей
нагрузке.
go fmt ./...
go vet ./...
go test ./...
go test -race ./...
go build ./...make check
make validate-k8s
make demo-up
make demo
make smoke
make demo-report
make demo-downПроцесс разработки описан в CONTRIBUTING.md, а проверка релиза — в docs/RELEASE_CHECKLIST.md.
- Архитектура
- Конфигурация
- Совместимость с Redis
- Развёртывание в staging
- Сценарии сбоев
- Наблюдаемость
- Тестирование производительности
- План развития
Мы ищем три команды, которые сталкивались с реальными инцидентами из-за горячих ключей в Redis или Valkey. Если вы можете протестировать одноузловую предварительную версию в изолированной среде, опишите нагрузку без конфиденциальных данных.
Apache-2.0. Copyright 2026 SlizenDB contributors. См. LICENSE и NOTICE.

