На наших сайтах работают два 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-lrunoeviction
на дискнет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 на сайте есть, а как он настроен — неизвестно?

Пришлите адрес — проверю, подходит ли политика памяти тому, что в нём лежит.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.