Скачать CV

Кэш

Memcached для страниц, Redis для lock

В стеке уже было два хранилища в памяти. У каждого теперь одна работа. HTML живёт в Memcached. Очереди, сессии и lock на пересборку живут в Redis.

CACHE_STORE смотрел в Memcached. QUEUE_CONNECTION и SESSION_DRIVER смотрели в Redis. Если считать их взаимозаменяемыми, блобы страниц смешиваются с reserved job в одной политике вытеснения. Когда Redis упирается в maxmemory, список новостей и lock Horizon могут уйти вместе. Это stampede и застрявшая очередь в один день.

Memcached быстр на get/set HTML и плох на lock. GET с промахом не обещает, что пересобирать будет один вызывающий. Redis обещает. SET key NX EX 5 это lock с TTL, и тот же инстанс уже крутит очередь.

HTML живёт в Memcached. Lock на пересборку живёт в Redis. MySQL видит одного писателя.
HTML живёт в Memcached. Lock на пересборку живёт в Redis. MySQL видит одного писателя.

Путь пересборки

При промахе воркер берёт lock в Redis. Если взял, читает MySQL, пишет Memcached, снимает lock. Если нет, отдаёт предыдущий HTML из парного ключа, который живёт до следующей успешной записи. Две секунды устаревшего HTML лучше стада запросов списка.

Ключи кэша несут ресурс, локаль и сегмент версии. Инкремент версии сбрасывает группу без удаления по маске. Публичные списки живут минуты. Всё, что зависит от одной записи, умирает этой записью.

Один запрос пересобирает. Остальные держат последний HTML. Без lock каждый промах бьёт в MySQL.
Один запрос пересобирает. Остальные держат последний HTML. Без lock каждый промах бьёт в MySQL.

nginx спереди

Анонимные хиты ещё проходят короткий microcache в nginx. Ключ это scheme, host, uri и локаль. Запросы с auth_token этот кэш обходят, поэтому вошедший пользователь не получает публичный фрагмент.

Разделение теперь правило этого сайта. Новое кэшированное чтение получает Memcached для блоба и Redis для lock. Redis не второе хранилище страниц. Memcached не хранилище сессий. В этом и обновление.

К новостям