Введение в кэширование в распределенной системе
Что такое кэш?
Кэш — это небольшое локальное хранилище с быстрым доступом, в котором мы храним часто используемые данные. Кэширование — это метод хранения копий часто используемых данных приложения в слое меньшей и более быстрой памяти, чтобы улучшить время извлечения данных, пропускную способность и затраты на вычисления.
Почему мы используем кэш?
Кэш основан на принципе локальности. Это означает, что часто используемые данные хранятся рядом с системой. Два вида местности:
- Местоположение во времени, когда данные, на которые недавно ссылались, с большой вероятностью будут упоминаться снова (т. е. местоположение, основанное на времени).
Коротко повторяющиеся ссылки на одни и те же данные. промежуток времени. - Пространственное местоположение, когда данные, хранящиеся рядом с данными, на которые недавно ссылались, также могут быть использованы снова (т. е. пространственноеместоположение)
Это относится только к элементу данных. которые смыкаются в памяти. например. Данные хранятся вместе в массиве
Как работает кэш?
Когда запрос поступает в систему, может быть два сценария. Если копия данных существует в кеше, это называется попаданием в кеш, а когда данные необходимо извлечь из основного хранилища данных, это называется промах кеша. Производительность кэша измеряется количеством попаданий в кэш из общего количества запросов.
Типы кеша
- Кэш сервера приложений. Размещение кеша непосредственно на сервере приложений позволяет локально хранить данные ответов. Каждый раз, когда к службе делается запрос, сервер возвращает локальные кэшированные данные, если они существуют. Если его нет в кеше, запрашивающий узел будет запрашивать данные из основного хранилища. Кэш может располагаться как в памяти (что очень быстро), так и на локальном диске узла (быстрее, чем в сетевом хранилище).
Проблема с этим типом кэширования возникает, когда у вас распределенная система. Это приводит к большому количеству промахов кеша, потому что каждый экземпляр имеет свой собственный кеш, который не содержит информации о других экземплярах. - Распределенный кеш: каждый узел будет иметь часть всего пространства кеша, а затем с помощью согласованной функции хеширования каждый запрос может быть направлен туда, где можно найти запрос кеша.
Кэш делится с помощью последовательного хеширования, и каждый запрос может быть направлен на узел, который содержит ответ для него.
- Глобальный кеш. Глобальный кеш — это отдельная кеш-память перед экземплярами сервера. Он общий для всех экземпляров и извлекает данные из основного хранилища, если их нет в самом кеше. Это увеличило задержку, но имеет преимущество в значительно лучшей производительности кэша.
- CDN: CDN (сеть распространения контента) используется там, где обслуживается большой объем статического контента. Ответ может быть файлом HTML, файлом CSS, файлом JavaScript, изображениями, видео и т. д. Сначала запросите у CDN данные, если они существуют, данные будут возвращены. Если нет, CDN будет запрашивать внутренние серверы, а затем кэшировать их локально.
Политики записи кэша
Политика кэширования — это набор правил, определяющих, как данные будут загружаться (и извлекаться) из кэш-памяти. Кэш состоит из копий данных и, таким образом, является временным хранилищем, поэтому при записи нам нужно решить, когда записывать в кеш, а когда — в первичное хранилище данных.
Наиболее распространенные политики записи кэша следующие:
- Кэширование со сквозной записью. В этой схеме данные записываются в кэш и соответствующую базу данных одновременно. Кэш обеспечивает быстрое извлечение, а поскольку данные записываются одновременно в кеш и первичное хранилище данных, обеспечивается полная согласованность.
Однако, поскольку каждую операцию записи приходится выполнять дважды, это приводит к большей задержке.
- Кэширование с обратной записью. При кэшировании с обратной записью данные записываются непосредственно в первичное хранилище данных. Кэш, в свою очередь, сверяется с первичным хранилищем данных, чтобы синхронизировать себя. Недостатком здесь является то, что кеш может время от времени отставать от основного хранилища, но дополнительная задержка компенсируется тем, что основное хранилище данных всегда является согласованным.
- Кэширование с обратной записью. При кэшировании с обратной записью данные сначала записываются в кэш, а затем в первичное хранилище данных. Здесь может быть два сценария: либо основное хранилище обновляется сразу после кэша, либо кэш-память сохраняется после удаления записи (в случае, если кэш-память уже была заполнена). В этом случае запись помечается грязным битом, чтобы отметить, что данные не синхронизированы.
Кэширование с обратной записью чревато потерей данных и должно использоваться только в операциях с большим количеством операций записи, где очень важна скорость записи.
Политики вытеснения кэша
Политики вытеснения кэша определяют набор правил, которые определяют, какие данные должны быть удалены, когда кэш заполнен и необходимо добавить новую запись.
Хорошая политика замены гарантирует, что кэшированные данные будут максимально релевантными для приложения, то есть в ней используется принцип локальности для оптимизации попаданий в кэш.
Таким образом, политика удаления кэша может быть определена только на основе того, какие данные хранятся в кэше. Некоторые из популярных алгоритмов вытеснения кэша:
- First In First Out (FIFO): этот кеш удаляет первую запись из кеша независимо от того, сколько раз он вызывался.
- Наименее недавно использовавшиеся (LRU): в первую очередь удаляются наименее использовавшиеся элементы.
- Самые последние использованные (MRU): сначала удаляются самые последние использованные элементы.
- Наименее часто используемые (LFU): подсчитывает, как часто запись считывалась из кэша. В первую очередь отбрасываются те, которые используются реже всего.
- Случайная замена (RR): случайным образом выбирает элемент-кандидат и отбрасывает его, чтобы освободить место, когда это необходимо.
Redis: распределенное кэширование
Redis — это хранилище данных в памяти, которое чаще всего используется в качестве распределенного кеша. Он предлагает множество эффективных структур данных, разработанных для обеспечения очень быстрого доступа к вашим данным. Он используется в качестве механизма кэширования в большинстве распределенных систем.
У Redis также есть возможность сохраняться на диске, чтобы кеш не терялся при перезапуске сервера. И Redis также может быть встроен в кластер, который распределяет кеш по нескольким серверам. Технически Redis можно использовать даже в качестве основной базы данных, хотя чаще мы используем его в качестве кэша, чтобы снизить нагрузку на многофункциональные базы данных, предназначенные для сохранения данных.
Redis написан на C, поэтому у него нет возможностей многопоточности, как у его аналогов на основе Java, таких как Hazelcast. Redis уникален тем, что поддерживает другие структуры данных, такие как отсортированные наборы, наборы хэшей и механизм публикации/подписки. Его также можно расширить с помощью сценариев lua. Это, вероятно, самый популярный и широко используемый из двух продуктов. Особенно за пределами экосистемы Java.
Поздравляю с завершением! Не стесняйтесь обсуждать технологии или любые интересные проекты на Twitter, Github, Medium, LinkedIn или Инстаграм.
Спасибо за прочтение!
Ссылки
- https://igotanoffer.com/blogs/tech/caching-system-design-interview
- https://www.geeksforgeeks.org/caching-system-design-concept-for-beginners/
- https://www.wwt.com/article/the-power-of-distributed-caching-with-redis
- Нарендра Л: https://www.youtube.com/watch?v=DUbEgNw-F9c
- https://www.youtube.com/watch?v=U3RkDLtS7uY