nginx и memcache

bigton
На сайте с 17.08.2009
Offline
43
623

Всем привет.

Можно ли через nginx реализовать следующее:

Страница /page.php?action=news

Контент:

пользователю1 -> контент1

пользователю2 -> контент2

пользователю3 -> контент3

...

?

Как мне представляется этого сделать нельзя, потому как я не представляю как nginx узнает права пользователя при обращении к скрипту, все таки права - уровень php.

Потому возникает следующий вопрос:


if ($memcache->get('page.news_user1') != '')
{
echo $memcache->get('page.news_user1');
}
else
{
$page = 'news';
echo $page;
$memcache->set('page.news_user1', $gz, false, 60);
}

Такая реализация кеширования корректна? То есть для каждой страницы на проекте и для каждого пользователя в memcache создается свой ключ? Получается если на проекте 5000 пользователей и 500 скриптов, то будет храниться 2.5М ключей со значениями (не просто значения, а HTML)!

Я в принципе могу разделить пользователей по уровню доступа (админ., редактор, авторизированный, не авторизированный и т.д.) и создавать кеши именно по уровням. Но мне все же интересна мощность memcache.

По умолчанию в memcache стоит какое то ограничение в 64М, это размер выделенной памяти в оперативке? Где тогда будут храниться мои 2,5М записей?)

В общем вопрос в том, как правильно/оптимально организовать кешинирование.

Всем спасибо!

[Удален]
#1

может хтмл все таки генерить, а хранить данные для его генерации? :-)

затраты по генерации хтмл такто ничтожные ...

bigton
На сайте с 17.08.2009
Offline
43
#2

Вот мне и интересно как лучше...

Хорошо, если хранить только данные, то лучше для каждого типа пользователя и для каждого пользователя конкретно?

[Удален]
#3

Как всё жутко у вас :))

if ($memcache->get('page.news_user1') != '') 
{
echo $memcache->get('page.news_user1');
}
else
{
$page = 'news';
echo $page;
$memcache->set('page.news_user1', $gz, false, 60);
}

Для начала поймите, что $memcache->get() функция выполняет ЗАПРОС! Зачем вы на получение данных тут выполняете 2 запроса?

if (FALSE !== ($content = $memcache->get('page.news_user1')))
{
echo $content;
}
else
{
$page = 'news';
echo $page;
$memcache->set('page.news_user1', $gz, false, 60);
}

Во-вторых, как вам правильно сказали - у вас будет переизбыток данных. Не стоит прямо всё хранить в мемкеше - храните только те блоки, которые используются часто. Вам нужно просто хранить для каждой группы пользователей не большой кусочек данных, который будет показываться на каждому странице, на сколько я понял.

У memcache нет ограничения на размер отведенной ему оперативной памяти. 64M - скорее всего - значение по умолчанию (сам не помню какое там умолчание, но похоже на правду).

Учтите, что вам (возможно) прийдется переносить всё это дело на хостинг. У вас-то дома может быть 4 Гб оперативы, а на shared-хостинге, боюсь, у вас будет несколько десятков мегабайт только.

Еще совет: суть должна быть в том, чтобы снизить нагрузку на базу при помощи кеширования в мемкеш наиболее часто показываемых блоков или данных. По сути для админов например, можно мемкеш и не использовать, а всегда брать только актуальные данные с базы - ну и что что для админа 20 запросов выполнится - ерунда какая.

So1 добавил 15.02.2011 в 08:06

Ах да... Забыл совсем добавить-то. Тут был еще вопрос про производительность memcache. Избегайте более 40.000 запросов в секунду. По сути в идеале у вас должно быть не более 20.000.

С этим когда-то столкнулся facebook. Но они сами переточили memcache под себя, чтобы он мог "держать" более 100.000 запросов.

bigton
На сайте с 17.08.2009
Offline
43
#4

Спасибо за расширенный ответ, но хочется еще больше информации :)

Про memcache:

1. вы сказали избегать более 40 000 запросов / сек. спасибо, это важная информация!

2. про память: все данные в memcache хранятся в памяти, то есть если у меня на сервере 12Г оперативной памяти, то я могу выделить 5Г на memcache и это будет нормально?

3. про масштабируемость: в memcache можно подключать несколько серверов, через запятую в конфиге. вот допустим я подключил 3 сервера, на них будет храниться одинаковая информация или создаться единое общее пространство, использующее ресурсы 3х серверов?

Про кеширование:

у меня много ресурсоемких операций (выборка данных + обработка данных), вот я решил использовать для этого memcache, но выяснилось что я не могу хранить в нем все что хочу.

Может быть тогда имеет смысл использовать сериализацию данных и ее хранение в файлах?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий