ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

инвалидация кеша


  • To: nginx-ru@xxxxxxxxx
  • Subject: инвалидация кеша
  • From: "AndrejAndb" <nginx-forum@xxxxxxxx>
  • Date: Sun, 16 Sep 2012 17:18:25 -0400
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tigger.jlkhosting.com; s=x; h=Date:Sender:From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To; bh=baPYX4bFApvBKWBXPk9g/UYrcP5O4khuiVIuIblgmtE=; b=oRWxsE0NLSQ8aNASnctcPBfsgjHCqZcc+3qqckhBPnmg8mXDmBAHOZd4+ldYbxTHJ04M/5+loMpJ+plTRRJI6iBoXGznY7LtwtklTzUesuPZYwaVh5ljHDplJYntdxlp;

Озадачился вопросом выборочной инвалидацией кэша.

к примеру следующий use case:
Есть 2 типа страниц:
1) список статей
2) статья с пользовательскими комментариями
страницы генерируются посредством fastcgi и кэшируются что то типа:
fastcgi_cache_path /var/cache/nginx levels= keys_zone=pagecache:360m
inactive=360m max_size=300m;
fastcgi_cache_key
"$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";

требуется 
1) при изменении статьи принудительно инвалидировать кэшированные страницы
со списком статей и страницы самой статьи
2) При добавлении комментария инвалидировать страницу статьи - куда был
добавлен комментарий


И решения которые приходили в голову:

1) Чистить ВЕСЬ кэш всегда - как-то не спортивно, и в случае высоких
нагрузок - неприменимо

2) При отдаче с PHP бэкенда, записывать запрашиваемый URL в отдельное
хранилище, и при необходимости инвалидировать страницу: выдернуть все
необходимые URL (попадающие под нужное условие) из хранилища и удалять все
файлы из /var/cache/nginx соответствующие
md5($request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri).
- Несколько сложно, и такой способ вызывает еще ряд сложностей...

3) При отдаче с PHP бэкенда писать в заголовок ответа Тэги страницы:
"X-CACHE-TAGS: entry_id1 entry_id2 entry_id3 entry_list" - список из 3х
статей
"X-CACHE-TAGS: entry_id1 entry_one" - статья id1 
И при необходимости инвалидировать все страницы, где упоминается entry_id1,
нужно будет пройтись по всем файлам в кэше, отыскать наличие в заголовке
данного тега и удалить его.
Идея показалась интересной, но при наличии большого кол-ва файлов в кэше -
процесс инвалидации может затянуться.

4) использовать memcache.
Вроде бы самый оптимальный вариант, поскольку PHP бэкенд знает куда что
пишет - и без проблем сможет инвалидировать... Единственный недостаток:
бэкенд не может писать заголовки ответа в такой кэш. Это минус - поскольку
усложнит конфиги nginx, но думаю можно смириться. Другой минус - кол-во
оперативной памяти под мемкэш куда более ограниченей свободного места на HDD
под файловый кэш.

И в общем то вопрос: не изобретаю ли я велосипедов? :)

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,230763,230763#msg-230763

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.