11 видів кешування для сучасного сайту



Автор даної статті не зустрічав структурованої оглядової інформації про важливих етапах кешування, тому йому хотілося б поділитися напрацьованим досвідом в цій області, з'єднати воєдино всю основну інформацію з даного питання, а також розглянути плюси і мінуси кожного виду кешування.

В першу чергу, хотілося б пояснити, що кешування – це одна з найбільш важливих складових будь-якого проекту. Зокрема, це єдиний спосіб зробити більше і швидше при використанні обмежених ресурсів. А, як відомо, ресурси завжди обмежені: як серверні, так і користувача.

Основною проблематикою кешування є швидкість реакції на запити до основних систем зберігання та обробки вхідної і вихідної структурованої інформації.

Уявіть, що необхідно здійснити швидку передачу інформації, однак швидкість доступу до даних вкрай низька. Або інша ситуація: швидкість хороша, але мало доступної пам'яті або ширина каналу недостатня, або процесорні і дискові фактори заважають здійснити завдання. У цьому випадку кешування – це єдиний вихід із ситуації.

Види кешування
Кешування (або кеш) – це якийсь проміжний буфер, в якому зберігаються дані. Завдяки кешування сторінка сайту не відтворюється заново для кожного користувача. Кешування дозволяє здійснювати роботу з великою кількістю даних в максимально стислі терміни і при обмежених ресурсах (серверних і користувальницьких).

Необхідно розуміти, що для роботи з даними можна проводити як на стороні клієнта, так і на сервері. Притому, серверна обробка даних централізована і має ряд безсумнівних переваг (особливо для служби підтримки).


Існує кілька видів кешування, пропонуємо розглянути кожен вид, його особливості та рекомендації щодо застосування:

1. Браузерне кешування або клієнтське кешування
Являє собою складання для браузера команди використовувати наявну кешовану копію. Робота такого кешування заснована на тому, що при повторному відвідуванні, браузеру віддається заголовок 304 Not Modified, а сама сторінка або картинка завантажуються з локального інтерфейсу кеш. Виходить, що ви економите на трафіку між браузером відвідувача і хостингом сайту. Відповідно, сторінка вашого сайту починає завантажуватися швидше.

1.1 Кешування файлів і зображень
Браузерне кешування як не можна краще підходить для сайтів, що містять велику кількість зображень: картинка не завантажується кожен раз при відкритті сайту, а просто завантажується через кеш браузера.


Це перший рівень кешування, який полягає у віддачі заголовка «expired» заголовок «304 Not Modified». Найбільш ефективним вважається кешування на 2 тижні.

Проте в даному випадку є важливий нюанс: якщо зображення на сайті змінюється, то браузер дізнається про це не відразу, а тільки якщо почекати expiry або скинути кеш в самому браузері. Це не дуже ефективно, якщо файл постійно змінюється і необхідно постійно віддавати його актуальну версію.

1.2 Кешування https
Спеціальні заголовки виду strict-security. Дозволяє браузеру завжди звертатися по https до обраного домену. Зберігає цей стан досить жорстко і, у разі скасування цього виду кеша, веб-браузер ще досить довго буде намагатися завантажити сторінку https, при цьому ігноруючи поточні заголовки.

1.3 Кешування центру сертифікації
Так званий, stamp центру сертифікації.

Даний вид кешування вважається обов'язковим для застосування, якщо ви не хочете, щоб користувачі вашого сайту чекали, коли центр сертифікації (а це якийсь сервер, який відповідає за достовірність вашого сертифіката) обробить запит від браузера користувача та підтвердить, що ваш сайт дійсно підтверджений їм.

1.4 Кешування сторінок
Коли сторінка вже сформовано, потрібно постійно відслідковувати її актуальність. Для цього ви повинні використовувати серверний кеш з відстеженням часу зміни окремих частин сторінки (якщо сторінка будується з безлічі динамічно генеруються блоків). При такому підході в кожному відповіді від сервера встановлені спеціальні заголовки, що позначають час зміни сторінки, які потім відправляються браузером користувача при повторному зверненні до сторінки сайту. Сервер при отриманні таких заголовків можемо проаналізувати поточний стан сторінки (можливо, навіть промалювати її), але замість вмісту сторінки віддати заголовок «304 Not Modified», що для інтерфейсу браузера буде означати, що можна показати сторінку з свого браузера користувача) кешу.

Звичайно, можна надсилати відповідні заголовки без використання серверного відстеження кешу, але у такому разі більшість користувачів отримають оновлення контенту сторінки досить пізно. При такому підході браузер іноді опитує сервер для отримання оновлень, але періодичність і правила для кожного браузера налаштовуються його розробником, тому сподіватися на те, що ваші користувачі отримають оновлення вчасно, не доводиться.

Як правило, кеш поділяється за типом користувачів:

— для авторизованих;
— для неавторизованих.

Цей поділ обумовлено унікальністю контенту, для кожного авторизованого користувача і спільністю контенту для гостьових користувачів. У більшості сайтів не авторизований користувач не може змінювати вміст сайту, а значить і впливати на його вміст.

Браузерний кеш дозволяє економити трафік і час, який витрачається на завантаження сторінок. Але для досягнення ефекту економії, користувач повинен хоча б один раз відвідати нашу сторінку, а це означає, що навантаження на серверні ресурси зменшиться, але не значно.

2. Серверне кешування
Під серверним кешуванням розуміються всі види кешування, при якому дані зберігаються на серверній стороні. Ці дані не доступні клієнтським браузерам. Кеш створюється і зберігається за принципом «один до багатьох» (в даному випадку, — це клієнтські пристрої).


2.1 Кешування сторінки цілком
Найбільш ефективний кеш. Чим він цікавий? Найбільша його перевага в тому, що віддача сторінки відбувається практично в момент звернення, як наслідок – це можливість обробки мільйонів запитів навіть на слабкому сервері зі швидкістю роботи пам'яті і з незначним залученням процесора.

Мабуть, будь-коли-небудь мріяв про сайт, що працює зі швидкістю «ping» або швидше.
Але й у цього типу кешу є свої мінуси: наприклад, неможливість кешувати сторінки для авторизованого користувача, якого користувача, вміст сторінки якого залежить від поточних змінних.

Використовуйте цей кеш, якщо серверу відомі всі статичні стану зовнішніх даних, такі як: uri, get (без додаткових параметрів), користувач не має права — тобто, фактично, це ідеальний стан сторінки для гостьових користувачів. Враховуйте той факт, що при такому кешуванні архітектура сайту або програми завжди повинна однотипно обробляти вхідні запити і віддавати однотипні відповіді. Такий стан є в будь-якому додатку або на сайті, його потрібно лише відстежити і застосувати до нього кеш.

Кешування сторінок цілком, найчастіше, застосовують в якихось екстрених випадках, при цьому кеш сторінок зберігається на заздалегідь зазначений час (від 2 хвилин), протягом якого відповіді від сервера однотипні (не дозволяйте браузеру кешувати це).

2.2 Кешування результатів компіляції php-файлів
Розрізняють чисту компіляцію коду, так і його оптимізацію під час компілювання (підміна скриптів). Найбільш яскраві приклади:

APC;
XCache;
— Компіляція з підміною скриптів HipHopVirtualMachine.

І той і інший вид кешування можуть використовуватися у проекті, але у кожного є власні нюанси, які необхідно враховувати при написанні коду.


2.3 Кешування окремих блоків сторінки
Це, мабуть, самий цікавий, але і складний вид кешування. Тим не менш, він теж може бути ефективним, і на його прикладі найлегше пояснити принципи кешування в цілому.
Необхідно відстежувати: стан таблиць, стан сесії користувача, вимикати чи кешування при POST або GET запити (http query), залежність від поточного адреси, сталість кешування (при зміні попередніх умов) або його динамічну підстроювання.

Кешування окремих блоків сторінок краще інших типів кешування підійде, якщо вам потрібно, наприклад, зменшити кількість запитів до бази даних від реальних (авторизованих) користувачів. До речі, при правильно заданих залежностях, він буде працювати навіть ефективніше, ніж всі наступні види кешування.

Чому цей вид кешування настільки важливий? Вся справа в тому, що розширення пулу серверів баз даних набагато більш складне завдання, ніж розширення пулу серверів php-частини сайту. Більш того, php конфлікти стану кешування вирішуються набагато легше, ніж конфлікти при роботі з безліччю баз даних.



2.4 Кешування php на основі неподільні ресурсів
Найкраще підходить при стандартизації запитів, отримання даних із загальних ресурсів, наявності внутрішніх змінних, до яких php-ресурси звертаються кілька разів при генерації сторінки.

2.5 Кешування php на основі загальних ресурсів
Таке кешування застосовуйте для зберігання сериализированных даних. Наприклад: конфігураційного файлу, стану таблиць, списків файлової системи.

2.6 Кешування mysql на основі query cache
Це досить відома і найбільш висвітлена тема. Тим не менш, хотілося б розглянути специфіку роботи з timestamp і те, як можна уникнути постійного скидання query cache.

Напевно, ви регулярно стикалися з ситуацією, коли необхідно віддати нові матеріали, дата публікації яких вже дозволена поточним timestamp? Простіше кажучи,

WHERE show_ts<=UNIX_TIMESTAMP()
Якщо використовувати постійно мінливий timestamp таких запитів, то sql кеш буде не тільки марний, але навіть шкідливий, тому що буде збільшуватись кількість кешованих запитів, дані яких застаріли в момент створення кеша.

Ми пропонуємо наступний вихід із ситуації:

Як правило, будь-який матеріал публікується в певні моменти часу. Приміром, 00:00. Все що потрібно зробити — створити запит, який буде оцінювати таблицю за максимальною даті, при цьому, меншою поточної.

Щось на кшталт:

SELECT SQL_NO_CACHE MAX(show_ts)… WHERE show_ts<=UNIX_TIMESTAMP();
Так, цей запит кешуватися не буде, але будуть кешуватися всі запити до цієї таблиці, якщо їх більше одного. Ця проста операція суттєво поліпшить життя sql-кешування.

Кешувати ці запити має сенс, якщо читань з таблиці трохи більше ніж запису.

2.7 Кешування mysql результатів роботи, агрегуючі таблиці
Існує правило: оновлення даних повинно бути значно менше, ніж читання для їх віддачі.

Тобто не має сенс агрегувати те, що зміниться в той же момент, при цьому важлива актуальність агрегованих даних.

Що вибирати для агрегування? Зазвичай це якась статистична інформація про кількість записів, дату останнього оновлення, автора останнього оновлення тощо.

Висновок
Враховуючи постійну мережеву навантаження, без кешування ви не зможете створити жоден проект. Кешування дає можливість доставити дані великому колу клієнтів, задіявши при цьому мінімальні ресурси. У цій статті ми розглянули безліч видів кешування, серед яких, впевнені, знайдеться відповідне рішення і для вашого проекту.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.