September 21, 2022

Поговорим о кешировании. Под капотом #5.

Мы каждый день пользуемся красивыми сайтами, которые способны творить совершенно удивительные вещи. Уже сейчас мы можем например пользоваться Photoshop или видеоредактором прямо в вебе. Различные системы учёта юзеров, обработки заказов в интернет магазинах заставляют задумываться: как много мощностей используется для работы таких механизмов. Well, it depends.

При качественной оптимизации своего ресурса можно достичь нереально крутых результатов. Стоит отдать должное математикам и Computer Science инженерам, которые придумывают новые алгоритмы, структуры данных, СУБД и прочие штуки, упрощающие жизнь как пользователям, так и обычным программистам.

Сейчас я постараюсь объяснить один из таких оптимизационных лайфхаков, как кеширование. А также дам ответы на такие вопросы как: почему не обновляются данные на странице, хотя я сохранил(а) уже 100500 раз, почему Ютуб в 2018 отписывал подписчиков и мог даже уходить в отрицательные значения, почему процессоры такие быстрые. Но обо всем по порядку.

Раньше, когда я был ещё неосведомлен в своей текущей предметной области, мне часто приходилось работать с данными на разных ресурсах (что то удалять, редактировать, сохранять и т.д.) но я не понимал одной вещи: бывает, сохраняешь, например, новую фамилию в профиле ВК, а отображается на странице все то же. Или допустим, загружаю файл, а на сайте его не видно. Я думаю, многие из читателей не раз замечали такие глюки в поведении интерфейса сайтов. Казалось, что в доме резко отключили интернет, или кнопка не прожалась, или что то ещё, но на самом деле все оказалось гораздо проще

Как я уже говорил, популярные ресурсы, которые мы посещаем, посещает одновременно сотни тысяч людей. Представьте, что к вам в дом / офис начало ломиться сразу 100 тысяч человек, смогли бы сдержать такой напор? Так вот, чтобы избежать падения сервера, умные люди придумали клонировать часто используемые юзерами данные в сверхбыстрые хранилища (или кеш-серверы), например, чья нибудь страница ВКонтакте (на самом деле не одна, а тысячи одновременно) сейчас хранится на таком сервере. Он не поддерживает многих удобных операций с данными, но зато выполняет свою задачу на отлично: быстро отдавать эти данные клиенту.

Тем самым, если бы эти 100 тысяч человек ломились бы в очень медленную базу данных (аналогия - в наш офис), скорее всего сервер бы не выдержал. Но если бы мы поставили стенд перед офисом с самой важной информацией (время работы, название улицы и т.д.), то большинство бы просто получило что хотело и не загружали бы очередь.

Этот подход используется практически в любом современном сайте, и вроде бы он решает эту оптимизационную проблему на отлично, но выдает новую: актуальность данных. Само понятие кеш означает, что данные берутся не из первоисточника, а из буферной зоны, которая обновляется не ежесекундно. Таким образом, если вы выполнили какое то действие, оно СНАЧАЛА запишется в базу данных, а уже потом обновится в кеш сервере. Кстати, часто пробовали обновить кэш приложений самостоятельно, например для освобождения места на телефоне? Так вот это как раз та же система. Только в этом кэше хранятся ещё более жирные данные: фото, видео, аудиофайлы и прочее (заметка: при очистке кэша через эту кнопку, кэш сайта и базы данных не обновится, а только то что хранится у вас)

Немного кринжовых мемов из 2016

Еще одну забавную историю с кешем вспомнил. В 2018 году (могу ошибаться с годом, но в целом Ютуб всегда лагучий) на Ютубе была интересная "особенность" - число подписчиков на любых каналах начало снижаться с необоснованно быстрой скоростью. Причем это действительно не было частным случаем, число стремилось к нулю у всех. Я точно не знаю механизм работы Ютуба и их баз данных, но вероятнее всего был сбой как раз в системе кеша. Только он был не на чтение, а и на запись в том числе, т.е. создавался пул (очередь) запросов на изменение числа подписчиков, и получалось так, что если несколько раз подписаться и отписаться, некоторые подписки зачтутся, но ВСЕ отписки зачтутся точно, из за чего общее число уходило в минус.

По поводу отписок (если не видно, откройте статью с браузера)

Кстати, само понятие кеш зародилось ещё очень давно. Прародителем кэша по праву можно считать слово буфер - некий элемент системы, снижающий негативное воздействия одних элементов на другие. Например, буфер в автомобилях или артиллерийских орудиях, да даже буферное государство - государство, которое разделяет две враждующие страны. Как раз поэтому кэш и решает проблему этих отрицательных воздействий, но уже в технологической области.

Но в айти премьера модели кеша состоялась в первых процессорах. Кеш - это супер быстрая память процессора, в которую он складывает самую важную информацию, таким образом она расположена настолько близко к ядру процессора, тем самым ускоряет доступ к данным (поскольку на таком уровне мы оперируем электрическими сигналами, чем меньшее расстояние ему нужно пройти - тем быстрее становится работа системы). Но такой кеш не может быть бесконечно большим, потому что с увеличением объема памяти растет размер устройства, а следовательно наше преимущество перестает работать. И умные инженеры придумали разделять кэши на уровни - L1, L2, L3. Чем меньше число, тем быстрее и ближе кэш находится , а значит тем он ценнее (ещё и потому, что его меньше).

Вот примерно такая схема

Ну и по сравнению с оперативной памятью, с жёстким диском или SSD кэш тоже безоговорочно выигрывает, нехило ускоряя работу привычных нам приложений.

Теперь вы знаете больше, а поэтому поставьте реакции на этот пост, мне будет очень приятно 😁