Pull to refresh

Правильное REST кэширование

Reading time 6 min
Views 5.3K
Пусть мы хотим написать свой хабрахабр с блекджеком и прочими прелестями. Страница статьи у нас стостоит из 3 объёмных блоков:
1. собственно текст статьи. меняется очень редко.
2. дерево комментариев. меняется относительно часто, но со временем всё реже и реже.
3. прямой эфир. небольшой, но меняется очень часто.

Допустим, что страница с этой статьёй доступна по адресу ?article:right.cache
Но внутрь неё мы не будем помещать никакого контента, а вынесем его в отдельные ресурсы, как это обычно делается со скриптами и стилями. Внутри ?article:right.cache будет лишь индекс подключаемых ресурсов с версиями.

?article:right.cache/content/version:123
?article:right.cache/comments/time:2010-12-01
?live/time:2010-12-01
?style:article/version:666
?script:article/version:333

Указание версии позволяет задать для ресурсов жёсткое кэширование. А для индексного файла, наоборот, зададим необходимость проверять при каждом запросе изменился ли он.

Такая организация гарантирует нам, что при появлении новых комментариев не придётся грузить статью заново. И наоборот, при изменении статьи не надо будет перегружать всё дерево комментариев. А уж про то, что из-за часто меняющегося прямого эфира нам не надо по новой грузить весь контент, и заикаться не стоит ;-)

Важно, чтобы поисковики видели ссылки на ресурсы и могли их проиндексировать. Однако, из поиска люди будут приходить на конкретный ресурс и даже на конкретную его версию. Соответственно, ресурс должен определять загружен ли он по прямой ссылке и если это так, то после загрузки клиентскими средствами редиректить на индекс. Если актуальная версия ресурса не изменилась, то он потом будет взят из кэша. Если же изменилась — будет загружена новая версия. Не такая уж страшная беда, на самом деле ;-)

Реализации с использованием фреймов и аякса довольно банальны, так что воспользуемся хтмл-инклудами.

Индекс не представляет из себя ничего нового.

<!DOCTYPE t:stylesheet [ <!ATTLIST t:stylesheet id ID #REQUIRED> ]><br><?xml-stylesheet type="text/xsl" href="#t:stylesheet"?><br><t:stylesheet id="t:stylesheet" version="1.0" xmlns:t="http://www.w3.org/1999/XSL/Transform"><br>    <t:output doctype-public="-//W3C//DTD XHTML 2.0//EN" doctype-system="http://www.w3.org/MarkUp/DTD/xhtml2.dtd" /><br>    <t:template match=" @* | node() "><br>        <t:copy><br>            <t:apply-templates select=" @* | node() " /><br>        </t:copy><br>    </t:template><br>    <t:template match=" *[ @src and contains( @srctype, 'xml' ) ] "><br>        <t:copy><br>            <t:apply-templates select=" @* " /><br>            <t:apply-templates select=' document( @src )//html/body/* ' /><br>        </t:copy><br>    </t:template><br>    <t:template match=" / "><br>        <t:apply-templates select=" document( '#t:stylesheet' )//html " /><br>    </t:template><br>    <t:template name="content"><br>        <html><br>         <head><br>            <title>Article with comments</title><br>            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><br>            <link href="?style:article/version:666" type="text/css" rel="stylesheet" /><br>            <script src="?script:article/version:333" type="text/javascript"></script><br>         </head><br>         <body><br>             <section src="?article:right.cache/content/version:123" srctype="text/xml"><br>                 <a href="?article:right.cache/content/version:123">article content</a><br>             </section><br>             <section src="?article:right.cache/comments/time:2010-12-01" srctype="text/xml"><br>                 <a href="?article:right.cache/comments/time:2010-12-01">article comments</a><br>             </section><br>             <section src="?live/time:2010-12-01" srctype="text/xml"><br>                 <a href="?live/time:2010-12-01">live content</a><br>             </section><br>         </body><br>        </html><br>    </t:template><br></t:stylesheet>


А вот у ресурса будут другие шаблоны.

<!DOCTYPE t:stylesheet [ <!ATTLIST t:stylesheet id ID #REQUIRED> ]><br><?xml-stylesheet type="text/xsl" href="#t:stylesheet"?><br><t:stylesheet id="t:stylesheet" version="1.0" xmlns:t="http://www.w3.org/1999/XSL/Transform"><br>    <t:output doctype-public="-//W3C//DTD XHTML 2.0//EN" doctype-system="http://www.w3.org/MarkUp/DTD/xhtml2.dtd" /><br>    <t:template name="content"><br>        <html><br>            <head><br>                <title>Article content</title><br>                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><br>            </head><br>            <body><br>                <h>Article content</h><br>            </body><br>        </html><br>    </t:template><br>    <t:template match=" / "><br>        <t:element name="meta"><br>            <t:attribute name="http-equiv">refresh</attribute><br>            <t:attribute name="content">0;url=?article:right.cache</attribute><br>        </t:element><br>    </t:template><br></t:stylesheet>

При прямом запросе браузером произойдёт редирект на ?article:right.cache
Поисковик же получит контент и проиндексирует его.
Tags:
Hubs:
+19
Comments 43
Comments Comments 43

Articles