Задать вопрос

MemcacheD: как хранятся ключи «под капотом» у него?

Доброго дня всем, назрел такой вопрос, может кто копал глубоко так в Memcached и сможет ответить:
Имеется сайт, на котором установлен memcached как расширение для php. (Убунту, Апач, php 7.1)

Вопрос 1: как хранятся ключи в memcached ? для каждого посетителся сайта отдельно ? или каждый посетитель использует один и тот же ключ?

Заметил, что сайт начинает тормозить когда много ключей в памяти (под кеш выделено 128мб, но половина свободна, и из оставшейся половины 90% wasted), как только почищу кеш полностью все работает - нормально до некоторых пор.
Вывел ключи все в памяти и вижу что например "key_1" - не один а их очень много, как будто для каждого посетителя создается свой, хотя значение в нем которое хранится, для любого из посетителей одно и то же.

Вопрос 2: если ключ связан с посетителем (сессией), можно ли как то настроить memcached, чтобы один ключ шарился между всеми посетителями, а не создавался для каждого свой ?

Заранее всем признателен за ответы и разъяснения
  • Вопрос задан
  • 229 просмотров
Подписаться 3 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Понятное дело что ни к посетителям, ни к сессиям мемкеш никакого отношения не имеет, как и РНР. HTTP - это stateless протокол, и все клиенты в РНР на одно лицо.
Мемкеш - это демон, который обслуживает входящие соединения, которые для него тоже все на одно лицо. Причём это лицо - РНР, а не какой-то там НТТР клиент.
РНР конечно может создать ключ в мемкеше на основе куки, полученной от пользователя, но для мемкеша это будет совершенно обычный ключ, не привязанный ни к какому "клиенту". А всё привязка - это чисто интерпретации на уровне пользовательского РНР кода.

А вот почему тормоза и дубли - тут я ответить не могу, потому что с мемкешем сталкивался лет 10 назад по касательной. Это к вопросу о том, что искать часы надо там, где потерял, а не не под фонарём потому что светлее. И задавать вопрос надо про исходную проблему, а не про свои догадки по её поводу.

По идее никаких дублей в мемкеше быть не должно - это key-value хранилище и ключи должны быть уникальными.
Возможно, выгрузка показывает уже просраченные ключи.
А тормоза, возможно, из-за того, что ключи постоянно перезаписываются, вместо того, чтобы записываться только тогда, когда надо обновить данные.

В целом мемкеш уже давно вышел из употребления, и его заменил редис
Ответ написан
2ord
@2ord
Как управлять ключами - зависит от логики приложения. Если используется расширение для PHP (что за расширение?), то надо знать под капотом по какой логике создаются ключи в кэше и истекает ли для них срок, после которого они удаляются из памяти. Бездумно отдавать кэш на все про все - 128 МБ памяти не хватает - демон начинает активно искать как освободить память, что ведет к задержкам.
У нас в приложении тоже были задержки свыше 1 секунды, что для Мемкеша что-то экстраординарное. И тоже было связано с заполнением памяти.

Пути решения:
1. добавить память Мемкешу
2. искать способы уменьшения ключей и ограничения срока их жизни.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы