Егор Львовский — «Кеширование на клиенте и сервере»

45

Upload: yandex

Post on 14-Dec-2014

4.472 views

Category:

Technology


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Егор Львовский — «Кеширование на клиенте и сервере»
Page 2: Егор Львовский — «Кеширование на клиенте и сервере»

Егор Львовский разработчик интерфейсов

Кеширование на сервере и клиенте

Page 3: Егор Львовский — «Кеширование на клиенте и сервере»

3

Все любят скорость

Page 4: Егор Львовский — «Кеширование на клиенте и сервере»
Page 5: Егор Львовский — «Кеширование на клиенте и сервере»
Page 6: Егор Львовский — «Кеширование на клиенте и сервере»
Page 7: Егор Львовский — «Кеширование на клиенте и сервере»

Кеширование

Page 8: Егор Львовский — «Кеширование на клиенте и сервере»

8

Кэш (англ. cache /ˈkæʃ/) — это компонент системы, который прозрачно сохраняет данные для того, чтобы будущие запросы к этим данным обрабатывались быстрее.

Wikipedia

Page 9: Егор Львовский — «Кеширование на клиенте и сервере»

9

Недостатки: •  вычисление значения для больших чисел может занять продолжительное время

•  мы каждый раз заново вычисляем значение факториала для всех чисел от 1 до n

function factorial(n) { "if (n === 0) return 1 "return n * factorial( n - 1 ) }"

Факториал

Page 10: Егор Львовский — «Кеширование на клиенте и сервере»
Page 11: Егор Львовский — «Кеширование на клиенте и сервере»

11

function factorial(n) { "factorial.cache = factorial.cache || [1] "return factorial.cache[n]"" " "|| (factorial.cache[n] = n * " " " " "factorial(n - 1)) }"

Факториал с кешем

5× 10× 20× 27×

http://jsperf.com/factorial-cache

Page 12: Егор Львовский — «Кеширование на клиенте и сервере»

Кеширование

Способ хранения данных

Показатель эффективности

Проблемы

Page 13: Егор Львовский — «Кеширование на клиенте и сервере»

13

Хеш-таблица

•  хранит пары Ключ → Значение • операции добавления, поиска и удаления •  cложность O(1)

Page 14: Егор Львовский — «Кеширование на клиенте и сервере»

14

Требования: •  хорошая перемешиваемость данных •  быстрый алгоритм вычисления

"function hash(chars) { var hash = 0 for (var i = 0, len = chars.length; i < len; ++i){ hash += chars[i].charCodeAt(0) } return hash }"

Хеш-функция

Page 15: Егор Львовский — «Кеширование на клиенте и сервере»

15

Хеш-функция

• Используется не только в хеш-таблицах • Принимает что-то возвращает строку (хеш)

–  MD5 ( 1 ⁄ 264 ) –  SHA1 –  CRC

• Используется для построения соответствий данных хешам

Page 16: Егор Львовский — «Кеширование на клиенте и сервере»

16

Время доступа в хеш-таблице

•  среднее — О(1) • наихудший случай — О(n)

Page 17: Егор Львовский — «Кеширование на клиенте и сервере»

17

Время доступа

Page 18: Егор Львовский — «Кеширование на клиенте и сервере»

18

Кеш-попадание

• напрямую влияет на эффективность • временная локальность • пространственная локальность

Page 19: Егор Львовский — «Кеширование на клиенте и сервере»

19

Быстро — не всегда правильно

Page 20: Егор Львовский — «Кеширование на клиенте и сервере»

20

Проблемы: •  неусточива к коллизиям •  одинаковые значения от разных ключей

–  aab  =  aba  =  baa  

"function hash(chars) { var hash = 0 for (var i = 0, len = chars.length; i < len; ++i){ hash += chars[i].charCodeAt(0) } return hash }"

Коллизии

Page 21: Егор Львовский — «Кеширование на клиенте и сервере»

21

Инвалидация

• одна из двух главных проблем программирования

• стандартные способы – по времени – по событию – по ключу

Page 22: Егор Львовский — «Кеширование на клиенте и сервере»
Page 23: Егор Львовский — «Кеширование на клиенте и сервере»

Кеш на сервере

В памяти приложения

На диске

Готовые системы

Page 24: Егор Львовский — «Кеширование на клиенте и сервере»

24

Кеширование в память

Преимущества • легкость использования • маленькое время доступа • большой размер кеша

Недостатки • неусточивость к перезагрузкам системы

Page 25: Егор Львовский — «Кеширование на клиенте и сервере»

25

Кеширование на диск

• решает проблемы памяти • используется как дополнительный способ •  сильно уступает в скорости

Page 26: Егор Львовский — «Кеширование на клиенте и сервере»

26

Системы кеширования

•  хеш-таблицы внутри •  удобный интерфейс снаружи •  доступ по сети

Page 27: Егор Львовский — «Кеширование на клиенте и сервере»

Я разработчик интерфейсов. Я не хочу ничего решать. Я хочу кешировать в браузере.

Клиентское кеширование

Page 28: Егор Львовский — «Кеширование на клиенте и сервере»

28

Кеш браузера

• Expires и Cache-Control: max-age. –  дают время свежести ресурса –  имеют больший вес

• Last-Modified и Etag!–  метки ресурсов –  браузер отпраляет значения на сервер, сервер решает!

Page 29: Егор Львовский — «Кеширование на клиенте и сервере»

Должен остаться только один

Page 30: Егор Львовский — «Кеширование на клиенте и сервере»

30

Память JS-приложения

•  сохраняем в объекты и переменные • получаем скорость и удобство • памяти меньше, но достаточно

Page 31: Егор Львовский — «Кеширование на клиенте и сервере»

31

Что кешируем?

Результаты работы функций, затрагивающих DOM-дерево

• $(‘.menu > :first-child a:first-of-type’) !

• querySelectorAll(‘.b-link’)!• $(‘.b-image’).width() • $(‘.b-menu’).offset()

Page 32: Егор Львовский — «Кеширование на клиенте и сервере»

32

Что кешируем?

• длинные цепочки свойств объектов –  document.forms[0].elements[0].value

•  геттеры и методы –  array.length –  Object.prototype.hasOwnProperty

•  сложные вычисляемые значения

Page 33: Егор Львовский — «Кеширование на клиенте и сервере»

33

jQuery

• обрабочики событий • построенные Sizzle-селекторы • результаты работы .data() DOM-нодам и хендлерам присваевается уникальный идентификатор

Page 34: Егор Львовский — «Кеширование на клиенте и сервере»

34

Данные, сохраненные в этих хранилищах сохраняются до того момента когда вы их удалите (local) либо до конца сессии (session). Перезагрузка страницы кеш не очищает.

length // возвращает размер хранилищаkey(index) // возвращает ключ по индексу хеш-таблицы !getItem(key) // возвращает элемент по ключу !setItem(key, value) // добавляет/обновляет removeItem(key) // удаляет элемент по ключу !clear() // очищает кэш!! !var foo = localStorage[‘bar’]; "localStorage[‘bar’] = foo; "

localStorage/sessionStorage

Page 35: Егор Львовский — «Кеширование на клиенте и сервере»

35

localStorage/sessionStorage

Можем кешировать •  пользовательские настройки •  введенную информацию в инпутах •  стили •  джаваскрипт

Доступны с FF 3.5, Chrome 4, Safari 4, Opera 10.5, IE 8

Page 36: Егор Львовский — «Кеширование на клиенте и сервере»

36

localStorage/sessionStorage

• Safari — 2× • Chrome и FF — 170× • Opera — 400× http://jsperf.com/localstorage2

Page 37: Егор Львовский — «Кеширование на клиенте и сервере»

37

localStorage/sessionStorage

http://www.w3.org/TR/webstorage

Page 38: Егор Львовский — «Кеширование на клиенте и сервере»

38

Offline Applications (AppCache)

Расширенное браузерное кеширование Контроль при помощи файла-манифеста text/cache-manifest — тип файла <html manifest=“cache.manifest”> !

Page 39: Егор Львовский — «Кеширование на клиенте и сервере»

39

CACHE MANIFEST"# 2012-09-25:v1"CACHE:"/favicon.ico"index.html"stylesheet.css"main.js""NETWORK:"/login"/api""FALLBACK:"/main.cgi /static.html"images/large/ images/offline.jpg"*.html /offline.html ""

AppCache Manifest

Page 40: Егор Львовский — «Кеширование на клиенте и сервере»

40

AppCache

Доступен c FF 3.5, Chrome 4, Safari 4, Opera 10.6, IE 10

http://www.w3.org/TR/offline-webapps

Page 41: Егор Львовский — «Кеширование на клиенте и сервере»

41

File API (Filesystem, Filewriter)

•  самая новая спецификация • позволяет очень гибко управлять кэшем • пока реализована только в Chrome 20+

http://www.w3.org/TR/file-system-api

Page 42: Егор Львовский — «Кеширование на клиенте и сервере»

42

Иногда, кеширование — зло

Page 43: Егор Львовский — «Кеширование на клиенте и сервере»

Нельзя просто так взять

и закешировать

Page 44: Егор Львовский — «Кеширование на клиенте и сервере»

44

На самом деле можно

Page 45: Егор Львовский — «Кеширование на клиенте и сервере»

Егор Львовский

разработчик интерфейсов

[email protected] @lvivski

Спасибо