На наших сайтах работают два Redis с противоположными настройками. В одном старые ключи выбрасываются, когда кончается память, и ничего не пишется на диск. В другом выбрасывать запрещено, а каждая запись сохраняется. Обе настройки правильные — для своей задачи. Перепутать их значит получить либо ошибки записи, либо медленный сайт.
Это шестая часть цикла «Сервер для WordPress».
Redis № 1: объектный кэш WordPress
Плагин объектного кэша складывает в Redis результаты запросов к базе: опции, записи, мету. Любой такой ключ можно вычислить заново — это просто ещё один запрос к базе.
redis:
command: ["redis-server",
"--maxmemory", "64mb",
"--maxmemory-policy", "allkeys-lru", # кончилась память — выбросить давно не нужное
"--save", "", "--appendonly", "no"] # на диск не писать
- вытеснение: потерянный ключ стоит один запрос к базе, а запрет вытеснения при заполнении сломал бы запись — и WordPress сыпал бы ошибками;
- без сохранения на диск: после перезапуска кэш наполнится сам за несколько запросов, а запись на диск — лишняя работа.
Подвох: временные значения WordPress (transients) при объектном кэше хранятся в нём же, а не в базе. Всё, что вы кладёте в transient с расчётом «пролежит год», может быть вытеснено. На этом сайте так хранится отметка голоса за статью — и это честно оговорено в статье про лайки. Важное — в базу.
Redis № 2: кэш фрагментов
На каталогах в Redis лежат готовые HTML-фрагменты ajax-блоков. Потерять такую ячейку — значит отдать посетителю блок, который будет собираться секунды.
redis:
command: >
redis-server
--maxmemory 1gb
--maxmemory-policy noeviction # ничего не выбрасывать
--appendonly yes # каждая запись — в журнал на диске
--appendfsync everysec
- без вытеснения: ячейка обязана дожить до своего срока, иначе посетитель получит промах кэша — ровно то, против чего всё строилось;
- журнал на диске: перезапуск контейнера не обнуляет кэш, Redis поднимается из журнала;
- следствие: упереться в потолок — значит перестать записывать. Поэтому код при отказе записи уходит на запасное хранилище, а занятость памяти выводится в виджет, и с 75% строка краснеет.
Сколько памяти давать и почему считать от двух поколений ключей — в 15-й части цикла про кэш фрагментов.
Шпаргалка
| Объектный кэш | Кэш фрагментов | |
|---|---|---|
| можно ли восстановить ключ | да, запросом к базе | да, но ценой секунд рендера посетителю |
| политика | allkeys-lru | noeviction |
| на диск | нет | appendonly yes |
| при заполнении | выбрасывает старое | отказывает в записи — нужен запасной путь и наблюдение |
Поднять потолок без потери кэша
Настройки у нас приходят из строки команды в compose, отдельного файла конфигурации нет — поэтому CONFIG REWRITE бесполезен. Порядок:
# 1) на живом Redis — действует сразу, без перезапуска
docker exec site-redis-1 redis-cli config set maxmemory 1gb
# 2) то же значение в compose — чтобы пережило пересоздание контейнера
И общее для обоих: Redis — в отдельной сети Docker с internal: true, без выхода наружу и без опубликованного порта. Об этом в первой части.
Redis на сайте есть, а как он настроен — неизвестно?
Пришлите адрес — проверю, подходит ли политика памяти тому, что в нём лежит.
// загружаю комментарии…