SlideShare une entreprise Scribd logo
1  sur  63
Télécharger pour lire hors ligne
Евгений Дорошенко
Кеширование
H. Jackson Brown, Jr.
You can't hire someone to
practice for you.
Практика
3
// returns factorial of n!
function getFactorial(n) {!
!if (0 === n) {!
! !return 1;!
!}!
!return n * getFactorial(n - 1);!
}!
!
var f1 = getFactorial(100); // 101 calls!
var f2 = getFactorial(110); // 111 calls!
var f3 = getFactorial(90); // 91 calls!
Расчёт факториала
4
var cacheFactorial = [];!
!
function getFactorial(n) {!
!if (undefined !== cacheFactorial[n])!
! !return cacheFactorial[n];!
!
!if (0 === n)!
! !cacheFactorial[n] = 1;!
!else!
! !cacheFactorial[n] = n * getFactorial(n - 1);!
!
!return cacheFactorial[n];!
}!
!
var f1 = getFactorial(100); // 101 calls!
var f2 = getFactorial(110); // 11 calls!
var f3 = getFactorial(90); // 1 call!
Расчёт факториала с кешированием
5
Основная идея
• Получив данные, сохраняем их в кеш
• При повторном обращении берём их из
кеша
• Из кеша взять дешевле, чем расcчитать
или скачать
6
Кеш должен быть быстрым,
иначе он не нужен
Albert Einstein
In theory, theory and practice are
the same. In practice, they are
not.
Теория
Интерфейс кеша
Подобно ассоциативному массиву
•  Сохранить данные по ключу
•  Получить данные по ключу
•  Удалить данные по ключу
Хеш-таблица
• Хранит пары ключ-значение
• Поддерживает операции
-  Вставка	
  новой	
  пары	
  
-  Поиск	
  значения	
  по	
  ключ	
  
-  Удаление	
  значения	
  по	
  ключу	
  
Хеш-таблица. Как устроено
•  Содержит массив H
•  Сначала получает индекс
i = hash(key)!
•  По индексу находит пару
H[i]!
•  Совершает целевую операцию
преобразование произвольных данных в
строку или число
Хеширование
function hash(data) {
var hash = 0, l = data.length;
for (var i = 0; i < l; i++) {
hash += data[i].charCodeAt(0);
}
return hash;
}
Значения хеш-функции от различных данных
совпадают
Хеширование. Коллизия
hash('трос'); // 4353
hash('сорт'); // 4353
hash('торс'); // 4353
hash('рост'); // 4353
Хеш-таблица. Разрешение коллизий
•  Метод цепочек
•  Метод открытой адресации
•  Усложняется структура данных
•  Усложняются алгоритмы операций
•  Влияет на производительность
Хеш-таблица. Переполнение
•  Спросить разрешения увеличить лимит
•  Не записывать данные в кеш (например,
exception)
•  Вытеснить старые данные новыми
Хеш-таблица. Алгоритмическая сложность
Факторы:
•  сложность алгоритма хеширования
•  сложность механизма обработки
переполнения
•  сложность механизма разрешения
коллизий
Можно пожертвовать
надёжностью во имя
производительности
Инвалидация кеша
•  Полнота инвалидации
•  Избыточность инвалидации
•  Сложность механизма инвалидации
Всегда нужен компромисс
Инвалидация по времени
•  При сохранении указываем срок
валидности
•  Берём данные из кеша, только если
срок валидности не истёк
Инвалидация по событию
•  Меняем данные
•  Узнаём об их изменении
•  Удаляем их из кеша
Инвалидация по ключу
•  Ключ зависит от данных
•  Меняются данные -> меняется ключ
•  Данные по старому ключу однажды
вытеснятся
Freeze файлов
•  Имя файла - хеш от содержимого
•  Файл кешируется «навеки»
•  Меняется имя файла -> меняется имя
•  Новый файл -> кешируется отдельно
•  Браузер перезапрашивает только
реально изменённые файлы
Кеширование на сервере
Способы кеширования на сервере
•  В памяти приложения
–  быстро
–  много места
–  энергозависимо
•  На жёстком диске
–  много места
–  энергонезависимо
–  медленно
Готовые системы кеширования
Популярные системы
•  memcached
•  redis
Особенности
•  Всё сделано за нас
•  Возможность кеширования по сети
•  Может быть медленнее, чем память приложения
Что нужно кешировать на сервере
•  результаты сложных вычислений
•  результаты запросов к БД
•  срендеренные HTML-страницы
•  предобработанные ресурсы
Протокол HTTP
Кеширование на клиенте
Кеширование в протоколе HTTP
Браузер
•  получает с сервера файлы
•  умеет сохранять их в кеш
•  выбирает сценарий кеширования по
заголовкам
HTTP заголовок
•  Файл по HTTP передаётся в обёртке
•  В обёртке есть специальные поля –
заголовки
•  Заголовок может быть установлен
– Web-сервером (в конфиге)
– Серверным приложением (в коде)
Как запретить http-кеширование
•  Ответ сервера содержит заголовок
Cache-Control: no-store!
!
•  В HTTP 1.0
Pragma: no-cache!
!
•  Для обратной совместимости
! !Pragma: no-cache!
! !Cache-Control: no-store!
Что не нужно кешировать
•  Результаты модифицирующих ajax-
запросов
•  Картинки CAPTCHA
•  И всё остальное, что меняется часто и
непредсказуемо
Как закешировать на время
•  Ответ сервера содержит заголовок
! !Expires: Mon, 15 Sep 2014 09:10:24 GMT!
•  Ответ сервера содержит заголовок
! !Cache-Control: max-age=3600!
или
! !Cache-Control: must-revalidate, max-
age=3600!
Когда нужно кешировать на время
•  Всегда, когда время изменения
известно, или поддаётся прогнозу
Кеширование с валидацией по времени
Сервер:
!Cache-Control: no-cache!
!Last-Modified: Sun, 15 Sep 2013 09:41:30 GMT!
!
Браузер:
If-Modified-Since: Sun, 15 Sep 2013 09:41:30 GMT!
!
Сервер, если ресурс не изменился:
!304 Not Modified!
!
Сервер, если ресурс изменился:
!200 OK!
!Cache-Control: no-cache!
!Last-Modified: Mon, 16 Sep 2013 09:41:30 GMT!
Кеширование с валидацией по Etag
Сервер:
!Cache-Control: no-cache!
!Etag: kj347kuyrqfweh!
!
Браузер:
If-None-Match: kj347kuyrqfweh!
!
Сервер, если ресурс не изменился:
!304 Not Modified!
!
Сервер, если ресурс изменился:
!200 OK!
!Cache-Control: no-cache!
!Etag: aslid8f7qe2q3w!
Когда нужно кешировать с валидацией
•  Кешировать хочется
•  Измениться может в любой момент
Что кешировать
•  Стили
•  Скрипты
•  Всё, что угодно
Управление кешем прокси
•  Proxy находится между браузером и сервером
•  Proxy тоже умеет кешировать
Разрешить кеширование на стороне прокси
!Cache-control: public!
Разрешить кеширование только на стороне браузера
!Cache-control: private!
3 факта о http-кешировании
•  При заполнении кеша старые файлы
вытесняются новыми
•  Пользователь может очистить кеш
•  Управлять http-кешем из js нельзя
Application cache (offline web apps)
Кеширование на клиенте
Offline web applications
•  HTML5 API
•  Позволяет web-приложению работать
offline
•  Позволяет предзагружать ресурсы в
фоне
•  Работать с кешем из javascript
•  В добрых браузерах поддерживается
давно
•  В ie – начиная с 10 версии
Offline web applications. Кратко об API
window.applicationCache.addEventListener(
'updateready', function() {
// updating
}
);
<html manifest="example.appcache">
...
</html>
CACHE MANIFEST
# Version 1.2.0
# Комментарий
http://www.example.com/index.html
http://www.example.com/header.png
Offline web applications. Как работает
1.  Браузер впервые пришёл на страницу c manifest
•  Загружает страницу
•  Загружает все ресурсы из manifest
•  Сохраняет всё в кеш
2.  Браузер повторно пришёл на страницу c manifest
•  Берёт все ресурсы из кеша
•  Запрашивает с сервера файл manifest
•  На applicationCache вызывает событие
checking!
3.  Если .manifest не изменился
•  На applicationCache вызывает событие
noupdate
!
Offline web applications. Как работает
4.  Если .manifest изменился
•  Перезапрашивает ресурсы по обычным правилам
http-кеширования
•  На applicationCache на каждый файл вызывает
событие progress и error в случае ошибки
5.  По завершении загрузки
•  На applicationCache вызывает событие cached!
•  Страницу сам не перезагружает
Offline web applications. Файл .manifest
CACHE MANIFEST
# version 1.0.2
CACHE:
index.html
style.css
image1.png
# Use from network if available
NETWORK:
network.html
# Fallback content
FALLBACK:
/ fallback.html
Offline web applications. JS API
•  status - статус app cache
•  length - количество динамических записей
•  item(index) - возвращает динамическую запись по
индексу
•  add(uri) - добавляет динамическую запись
•  remove(uri) - удаляет динамическую запись
•  update() - раучной запуск обновления appCache
•  swapCache() - применить обновлённый кеш
В памяти js-приложения
Кеширование на клиенте
1.  Результаты запросов к DOM-дереву
Кешируем в памяти js-приложения
var element = $('.myElement');
element.on('click', function() {
// сотворить добро
});
if (element.is(':visible')) {
element.addClass('highlighted');
} else {
element.removeClass('highlighted');
}
2. Результаты вызова «опасных методов»
Кешируем в памяти js-приложения
var height = $('.myElement’).height();
var width = $('.myElement’).width();
var offset = $('.myElement’).offset();
«Опасные» свойства
•  offsetHeight !
•  offsetWidth!
3. Длинные цепочки доступа
Кешируем в памяти js-приложения
document.forms[0].elements[0].value
•  3 операции доступа к полю объекта
•  2 операции доступа к элементу
массива
var value = document.forms[0].elements[0].value;
4. Свойство length массивов
Кешируем в памяти js-приложения
var l = items.length;
for (var i = 0; i < l; i++) {
// сотворить добро
}
5. Результаты сложных вычислений
В cookies
Кеширование на клиенте
Кеширование в cookies
•  cookies – фрагмент данных, хранимый
на клиенте
•  ограничение порядка 4kB
•  данные гоняются между клиентом и
сервером
Web Storage
Кеширование на клиенте
Web Storage
•  Позволяет хранить данные на клиенте
•  Поддерживается везде, кроме IE7 и старше
•  Данные хранятся на диске
•  Отдельно для каждого домена 2 уровня
•  Внутри – хеш-таблица
•  Не использует вытеснение
Web Storage. Ограничения
•  Пространство на 1 домен 2-го уровня
•  IE: 10 MB
•  Firefox, Opera, Safari, Chrome: 5 MB
•  Chrome: фактически 2.5 MB
•  В Opera и Firefox можно увеличить в
настройках
55
window.localStorage!
window.sessionStorage!
Web Storage. JS API
•  length - количество элементов в storage
•  key(Number index) - возвращает ключ n-го элемента
•  getItem(key) - возвращает значение по ключу
•  setItem(key, data) - сохраняет значение по ключу
•  removeItem(key) - удаляет пару ключ-значение
•  clear() - очищает storage
•  Событие storage на window!
Web Storage. Переполнение
•  Opera предлагает увеличить предел
•  Другие браузеры бросают exception
QUOTA_EXCEEDED_ERR
Web Storage. Для чего?
•  Сохранение значений форм
•  Хранение ресурсов, загруженных ajax-
ом
•  Взаимодействие между соседними
вкладками
Web Storage. Недостатки
•  Неструктурированные данные
•  Может работать медленно
IndexedDB и WebSQL
Кеширование на клиенте
IndexedDB и WebSQL
•  больше данных (десятки мегабайт)
•  структурировано, индексируется
•  может быть быстрее, чем Web Storage
•  сложный API
•  webSQL не поддерживается в IE и FF
•  indexedDB не поддерживается в Safari
Заключение
Заключение
•  Кеширование – общепринятый паттерн
•  Кеширование ускоряет
•  Платим памятью и сложной логикой
•  Данные однажды устареют
•  Помним о браузерном кешировании
•  Кешировать в память приложения –
дёшево и эффективно
Евгений Дорошенко
doroshenkoes@yandex.ru
Всё.

Contenu connexe

Tendances

PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)Ontico
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...zfconfua
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Mikhail Davydov
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Cache2012 administrationbasics
Cache2012 administrationbasicsCache2012 administrationbasics
Cache2012 administrationbasicsDenis Pavlov
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Ontico
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Ilyas Salikhov
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассникахodnoklassniki.ru
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview ReleaseDenis Shestakov
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Ontico
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераodnoklassniki.ru
 
Александр Шуменко - Varnish for authenticated users
Александр Шуменко - Varnish for authenticated usersАлександр Шуменко - Varnish for authenticated users
Александр Шуменко - Varnish for authenticated usersLEDC 2016
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb SpockBohdan Danyliuk
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 

Tendances (20)

PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Cache2012 administrationbasics
Cache2012 administrationbasicsCache2012 administrationbasics
Cache2012 administrationbasics
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
бегун
бегунбегун
бегун
 
бегун
бегунбегун
бегун
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
Александр Шуменко - Varnish for authenticated users
Александр Шуменко - Varnish for authenticated usersАлександр Шуменко - Varnish for authenticated users
Александр Шуменко - Varnish for authenticated users
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 

En vedette

Социальные сети
Социальные сетиСоциальные сети
Социальные сетиJuliaSolovyova22
 
кеширование в бд
кеширование в бдкеширование в бд
кеширование в бдMax Lapshin
 
Разработка соц. сети на Друпале
Разработка соц. сети на ДрупалеРазработка соц. сети на Друпале
Разработка соц. сети на ДрупалеDrupal Camp Kyiv
 
Какие задачи бизнеса помогают решать соц. сети
Какие задачи бизнеса помогают решать соц. сетиКакие задачи бизнеса помогают решать соц. сети
Какие задачи бизнеса помогают решать соц. сетиNatalia Odegova
 
Дизайн в разработке — Роман Квартальнов
Дизайн в разработке — Роман КвартальновДизайн в разработке — Роман Квартальнов
Дизайн в разработке — Роман КвартальновZephyrlab
 

En vedette (6)

Социальные сети
Социальные сетиСоциальные сети
Социальные сети
 
кеширование в бд
кеширование в бдкеширование в бд
кеширование в бд
 
Разработка соц. сети на Друпале
Разработка соц. сети на ДрупалеРазработка соц. сети на Друпале
Разработка соц. сети на Друпале
 
Какие задачи бизнеса помогают решать соц. сети
Какие задачи бизнеса помогают решать соц. сетиКакие задачи бизнеса помогают решать соц. сети
Какие задачи бизнеса помогают решать соц. сети
 
10 000 подписчиков_3_06
10 000 подписчиков_3_0610 000 подписчиков_3_06
10 000 подписчиков_3_06
 
Дизайн в разработке — Роман Квартальнов
Дизайн в разработке — Роман КвартальновДизайн в разработке — Роман Квартальнов
Дизайн в разработке — Роман Квартальнов
 

Similaire à 2013 09 19 кеширование на клиенте и сервере

PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Yandex
 
Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus0leGG
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»DevDay
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
[ONSEC ]XSS vs waf
[ONSEC ]XSS vs waf[ONSEC ]XSS vs waf
[ONSEC ]XSS vs wafd0znp
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько разRootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько разTimur Batyrshin
 
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...Ontico
 
Построение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайтПостроение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайтAlexander Mazurov
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.Igor Shkulipa
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajaxYandex
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Open-IT
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловGeeksLab Odessa
 
«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42DevDay
 
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...JavaDayUA
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 

Similaire à 2013 09 19 кеширование на клиенте и сервере (20)

PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»
 
Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
[ONSEC ]XSS vs waf
[ONSEC ]XSS vs waf[ONSEC ]XSS vs waf
[ONSEC ]XSS vs waf
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько разRootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
RootConf 2015: Как Vagrant и Chef ускорили разработку в несколько раз
 
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
Как Vagrant и Chef ускорили разработку в несколько раз / Тимур Батыршин (Cina...
 
Построение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайтПостроение аналитического хранилища на 100 петабайт
Построение аналитического хранилища на 100 петабайт
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
Service workers
Service workersService workers
Service workers
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajax
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42
 
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 

Plus de Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

Plus de Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

2013 09 19 кеширование на клиенте и сервере

  • 2. H. Jackson Brown, Jr. You can't hire someone to practice for you. Практика
  • 3. 3 // returns factorial of n! function getFactorial(n) {! !if (0 === n) {! ! !return 1;! !}! !return n * getFactorial(n - 1);! }! ! var f1 = getFactorial(100); // 101 calls! var f2 = getFactorial(110); // 111 calls! var f3 = getFactorial(90); // 91 calls! Расчёт факториала
  • 4. 4 var cacheFactorial = [];! ! function getFactorial(n) {! !if (undefined !== cacheFactorial[n])! ! !return cacheFactorial[n];! ! !if (0 === n)! ! !cacheFactorial[n] = 1;! !else! ! !cacheFactorial[n] = n * getFactorial(n - 1);! ! !return cacheFactorial[n];! }! ! var f1 = getFactorial(100); // 101 calls! var f2 = getFactorial(110); // 11 calls! var f3 = getFactorial(90); // 1 call! Расчёт факториала с кешированием
  • 5. 5 Основная идея • Получив данные, сохраняем их в кеш • При повторном обращении берём их из кеша • Из кеша взять дешевле, чем расcчитать или скачать
  • 6. 6 Кеш должен быть быстрым, иначе он не нужен
  • 7. Albert Einstein In theory, theory and practice are the same. In practice, they are not. Теория
  • 8. Интерфейс кеша Подобно ассоциативному массиву •  Сохранить данные по ключу •  Получить данные по ключу •  Удалить данные по ключу
  • 9. Хеш-таблица • Хранит пары ключ-значение • Поддерживает операции -  Вставка  новой  пары   -  Поиск  значения  по  ключ   -  Удаление  значения  по  ключу  
  • 10. Хеш-таблица. Как устроено •  Содержит массив H •  Сначала получает индекс i = hash(key)! •  По индексу находит пару H[i]! •  Совершает целевую операцию
  • 11. преобразование произвольных данных в строку или число Хеширование function hash(data) { var hash = 0, l = data.length; for (var i = 0; i < l; i++) { hash += data[i].charCodeAt(0); } return hash; }
  • 12. Значения хеш-функции от различных данных совпадают Хеширование. Коллизия hash('трос'); // 4353 hash('сорт'); // 4353 hash('торс'); // 4353 hash('рост'); // 4353
  • 13. Хеш-таблица. Разрешение коллизий •  Метод цепочек •  Метод открытой адресации •  Усложняется структура данных •  Усложняются алгоритмы операций •  Влияет на производительность
  • 14. Хеш-таблица. Переполнение •  Спросить разрешения увеличить лимит •  Не записывать данные в кеш (например, exception) •  Вытеснить старые данные новыми
  • 15. Хеш-таблица. Алгоритмическая сложность Факторы: •  сложность алгоритма хеширования •  сложность механизма обработки переполнения •  сложность механизма разрешения коллизий
  • 16. Можно пожертвовать надёжностью во имя производительности
  • 17. Инвалидация кеша •  Полнота инвалидации •  Избыточность инвалидации •  Сложность механизма инвалидации Всегда нужен компромисс
  • 18. Инвалидация по времени •  При сохранении указываем срок валидности •  Берём данные из кеша, только если срок валидности не истёк
  • 19. Инвалидация по событию •  Меняем данные •  Узнаём об их изменении •  Удаляем их из кеша
  • 20. Инвалидация по ключу •  Ключ зависит от данных •  Меняются данные -> меняется ключ •  Данные по старому ключу однажды вытеснятся
  • 21. Freeze файлов •  Имя файла - хеш от содержимого •  Файл кешируется «навеки» •  Меняется имя файла -> меняется имя •  Новый файл -> кешируется отдельно •  Браузер перезапрашивает только реально изменённые файлы
  • 23. Способы кеширования на сервере •  В памяти приложения –  быстро –  много места –  энергозависимо •  На жёстком диске –  много места –  энергонезависимо –  медленно
  • 24. Готовые системы кеширования Популярные системы •  memcached •  redis Особенности •  Всё сделано за нас •  Возможность кеширования по сети •  Может быть медленнее, чем память приложения
  • 25. Что нужно кешировать на сервере •  результаты сложных вычислений •  результаты запросов к БД •  срендеренные HTML-страницы •  предобработанные ресурсы
  • 27. Кеширование в протоколе HTTP Браузер •  получает с сервера файлы •  умеет сохранять их в кеш •  выбирает сценарий кеширования по заголовкам
  • 28. HTTP заголовок •  Файл по HTTP передаётся в обёртке •  В обёртке есть специальные поля – заголовки •  Заголовок может быть установлен – Web-сервером (в конфиге) – Серверным приложением (в коде)
  • 29. Как запретить http-кеширование •  Ответ сервера содержит заголовок Cache-Control: no-store! ! •  В HTTP 1.0 Pragma: no-cache! ! •  Для обратной совместимости ! !Pragma: no-cache! ! !Cache-Control: no-store!
  • 30. Что не нужно кешировать •  Результаты модифицирующих ajax- запросов •  Картинки CAPTCHA •  И всё остальное, что меняется часто и непредсказуемо
  • 31. Как закешировать на время •  Ответ сервера содержит заголовок ! !Expires: Mon, 15 Sep 2014 09:10:24 GMT! •  Ответ сервера содержит заголовок ! !Cache-Control: max-age=3600! или ! !Cache-Control: must-revalidate, max- age=3600!
  • 32. Когда нужно кешировать на время •  Всегда, когда время изменения известно, или поддаётся прогнозу
  • 33. Кеширование с валидацией по времени Сервер: !Cache-Control: no-cache! !Last-Modified: Sun, 15 Sep 2013 09:41:30 GMT! ! Браузер: If-Modified-Since: Sun, 15 Sep 2013 09:41:30 GMT! ! Сервер, если ресурс не изменился: !304 Not Modified! ! Сервер, если ресурс изменился: !200 OK! !Cache-Control: no-cache! !Last-Modified: Mon, 16 Sep 2013 09:41:30 GMT!
  • 34. Кеширование с валидацией по Etag Сервер: !Cache-Control: no-cache! !Etag: kj347kuyrqfweh! ! Браузер: If-None-Match: kj347kuyrqfweh! ! Сервер, если ресурс не изменился: !304 Not Modified! ! Сервер, если ресурс изменился: !200 OK! !Cache-Control: no-cache! !Etag: aslid8f7qe2q3w!
  • 35. Когда нужно кешировать с валидацией •  Кешировать хочется •  Измениться может в любой момент Что кешировать •  Стили •  Скрипты •  Всё, что угодно
  • 36. Управление кешем прокси •  Proxy находится между браузером и сервером •  Proxy тоже умеет кешировать Разрешить кеширование на стороне прокси !Cache-control: public! Разрешить кеширование только на стороне браузера !Cache-control: private!
  • 37. 3 факта о http-кешировании •  При заполнении кеша старые файлы вытесняются новыми •  Пользователь может очистить кеш •  Управлять http-кешем из js нельзя
  • 38. Application cache (offline web apps) Кеширование на клиенте
  • 39. Offline web applications •  HTML5 API •  Позволяет web-приложению работать offline •  Позволяет предзагружать ресурсы в фоне •  Работать с кешем из javascript •  В добрых браузерах поддерживается давно •  В ie – начиная с 10 версии
  • 40. Offline web applications. Кратко об API window.applicationCache.addEventListener( 'updateready', function() { // updating } ); <html manifest="example.appcache"> ... </html> CACHE MANIFEST # Version 1.2.0 # Комментарий http://www.example.com/index.html http://www.example.com/header.png
  • 41. Offline web applications. Как работает 1.  Браузер впервые пришёл на страницу c manifest •  Загружает страницу •  Загружает все ресурсы из manifest •  Сохраняет всё в кеш 2.  Браузер повторно пришёл на страницу c manifest •  Берёт все ресурсы из кеша •  Запрашивает с сервера файл manifest •  На applicationCache вызывает событие checking! 3.  Если .manifest не изменился •  На applicationCache вызывает событие noupdate !
  • 42. Offline web applications. Как работает 4.  Если .manifest изменился •  Перезапрашивает ресурсы по обычным правилам http-кеширования •  На applicationCache на каждый файл вызывает событие progress и error в случае ошибки 5.  По завершении загрузки •  На applicationCache вызывает событие cached! •  Страницу сам не перезагружает
  • 43. Offline web applications. Файл .manifest CACHE MANIFEST # version 1.0.2 CACHE: index.html style.css image1.png # Use from network if available NETWORK: network.html # Fallback content FALLBACK: / fallback.html
  • 44. Offline web applications. JS API •  status - статус app cache •  length - количество динамических записей •  item(index) - возвращает динамическую запись по индексу •  add(uri) - добавляет динамическую запись •  remove(uri) - удаляет динамическую запись •  update() - раучной запуск обновления appCache •  swapCache() - применить обновлённый кеш
  • 46. 1.  Результаты запросов к DOM-дереву Кешируем в памяти js-приложения var element = $('.myElement'); element.on('click', function() { // сотворить добро }); if (element.is(':visible')) { element.addClass('highlighted'); } else { element.removeClass('highlighted'); }
  • 47. 2. Результаты вызова «опасных методов» Кешируем в памяти js-приложения var height = $('.myElement’).height(); var width = $('.myElement’).width(); var offset = $('.myElement’).offset(); «Опасные» свойства •  offsetHeight ! •  offsetWidth!
  • 48. 3. Длинные цепочки доступа Кешируем в памяти js-приложения document.forms[0].elements[0].value •  3 операции доступа к полю объекта •  2 операции доступа к элементу массива var value = document.forms[0].elements[0].value;
  • 49. 4. Свойство length массивов Кешируем в памяти js-приложения var l = items.length; for (var i = 0; i < l; i++) { // сотворить добро } 5. Результаты сложных вычислений
  • 51. Кеширование в cookies •  cookies – фрагмент данных, хранимый на клиенте •  ограничение порядка 4kB •  данные гоняются между клиентом и сервером
  • 53. Web Storage •  Позволяет хранить данные на клиенте •  Поддерживается везде, кроме IE7 и старше •  Данные хранятся на диске •  Отдельно для каждого домена 2 уровня •  Внутри – хеш-таблица •  Не использует вытеснение
  • 54. Web Storage. Ограничения •  Пространство на 1 домен 2-го уровня •  IE: 10 MB •  Firefox, Opera, Safari, Chrome: 5 MB •  Chrome: фактически 2.5 MB •  В Opera и Firefox можно увеличить в настройках
  • 55. 55 window.localStorage! window.sessionStorage! Web Storage. JS API •  length - количество элементов в storage •  key(Number index) - возвращает ключ n-го элемента •  getItem(key) - возвращает значение по ключу •  setItem(key, data) - сохраняет значение по ключу •  removeItem(key) - удаляет пару ключ-значение •  clear() - очищает storage •  Событие storage на window!
  • 56. Web Storage. Переполнение •  Opera предлагает увеличить предел •  Другие браузеры бросают exception QUOTA_EXCEEDED_ERR
  • 57. Web Storage. Для чего? •  Сохранение значений форм •  Хранение ресурсов, загруженных ajax- ом •  Взаимодействие между соседними вкладками
  • 58. Web Storage. Недостатки •  Неструктурированные данные •  Может работать медленно
  • 60. IndexedDB и WebSQL •  больше данных (десятки мегабайт) •  структурировано, индексируется •  может быть быстрее, чем Web Storage •  сложный API •  webSQL не поддерживается в IE и FF •  indexedDB не поддерживается в Safari
  • 62. Заключение •  Кеширование – общепринятый паттерн •  Кеширование ускоряет •  Платим памятью и сложной логикой •  Данные однажды устареют •  Помним о браузерном кешировании •  Кешировать в память приложения – дёшево и эффективно