Фотография Джошуа Коулман на Неспособный
Кэширование является одним из самых популярных инструментов, используемых для масштабирования систем, и любой, кто хочет поддерживать высокую пропускную способность, устойчивую и экономичную продукцию, должен понимать, как их использовать, поскольку финансово нецелесообразно применять только вычислительные ресурсы для удовлетворения требований доступа.
Знание основ об этом и какие параметры вы должны искать при выборе вашего решения, редко рассматривается и, следовательно, является целью этой статьи.
Не спешите свое решение
Если кто -то будет искать кэширование, он найдет множество учебных пособий, обучающих, как настроить ваше решение. Они делают это так просто в использовании кэша в вашем приложении, что можно сделать, не задумываясь дважды. Будьте осторожны, каждый выбор имеет расходы и компромиссы, кэширование ничем не отличается.
Обычно мы можем найти плохие конструкции кеша, когда наткнулись на самые важные показатели для него: соотношение попадания и коэффициент мисс. В качестве краткого обзора мы можем определить эти метрики следующим образом:
Коэффициент хит : Когда кеш имеет Ключ и может предоставить значение для использования системы, мы называем это Хит Анкет Метрика просто Количество хитов/количество поисков Анкет
Коэффициент мисс : Когда кеш не Ключ и значение должны быть рассчитаны для использования системы, мы называем ее Мисс Анкет Метрика просто Количество промахов/количество поисков Анкет
Количество поисков это просто общее количество доступа к кешу, которое является Поиск + промахи Анкет
Вы можете знать, что кэш не является эффективным, если он имеет низкий уровень попадания и, следовательно, высокий коэффициент промахи. Какие низкие или высокие средства будут зависеть от вашей проблемы. Обнаружение ваших базовых показателей может быть достигнуто только посредством нашего первого руководства.
Методические рекомендации
Следите за вашим
Вы должны настроить способ захватить соотношение хитов и промахов вашего решения в кеш. То, как вы будете делать это, очень надежно по сравнению с выбранной реализацией, но большая часть должна иметь простой способ извлечения этих статистических данных, а если нет, рассмотрите возможность поиска других.
Наиболее важным в мониторинге является то, что вы сможете экспериментировать с различными алгоритмами и компромиссами, представленными в нижеуказанных рекомендациях, и стремиться к улучшению ваших соотношений. Следовательно, формулируйте гипотезу и позвольте вашим данным управлять вашим решением.
Компромиссы: производительность и устойчивость против согласованности
Кэширование — одна из самых простых и более мощных идей в вычислении. Понимание и применение его основных случаев легко, но может стать чрезвычайно тяжелым, чем вы себе представляете. Поэтому классическая фраза: «В информатике есть только две сложные вещи: недействительность кэша и называть вещи». Но почему кэш -недействительность такая тяжелая? Потому что это обычно имеет решающее значение и имеет много движущихся частей.
Движущиеся части исходят из того факта, что кэши улучшают производительность приложения, потому что они приближают данные, что также означает, что мы теперь вышли из рельсов с наиболее важным принципом для последовательности: иметь один источник истины. Это имеет еще один эффект, который является устойчивостью, с тех пор, как наш основной источник информации исчезает, наше приложение может выжить немного дольше с его кэшированными значениями.
Критический сегмент обычно возникает, когда вам нужно обновить данные в вашем кэше. Чтобы предоставить вашему пользователю значимую информацию, вам необходимо понять шаблоны доступа, чтобы выбрать правильный алгоритм и параметры выселения, которые будут сбалансировать производительность и правильность, выбор неправильного, вероятно, повредит вашему продукту. Кроме того, существует случай, когда вам нужно принудительно очистить свой кэш, и распределенный его характер может вызвать большую боль в процессе недействительности каждого узла кеша.
Следовательно, добавление кеша в ваше решение-это компромисс между производительности+устойчивостью и согласованностью, поэтому первый вопрос, который вы должны задать себе: «Может ли моя система жить с потенциально старыми и недопустимыми данными? «Если ваш ответ — да, то вы можете продолжить здесь, в противном случае кэширование принесет вам больше вреда, чем пользы.
Ключ
Итак, вы решили, что действительно хотите кеш. Первое решение, которое вам нужно будет принять, — это ваш ключ, то есть то, что вы будете использовать в качестве ключа кэша для индексации ваших дорогостоящих вычисленных значений?
Это важно, потому что вам необходимо проанализировать свою кардинальность клавиш, что означает, сколько различных значений может иметь ваш ключ. Например, логический ключ имеет кардинальность 2 (верно или неверно), тогда как идентификатор клиента может иметь тысячи возможных значений. Это действительно важно понимать, потому что низкий ключ кардинальности ограничит объем данных, которые может хранить ваш кэш, но ваш коэффициент попадания будет действительно высоким. С другой стороны, если ключ имеет чрезвычайно высокую кардинальность (склонность к уникальности, никогда не повторяя себя), ваш кэш может расти в геометрической прогрессии, и вы можете в конечном итоге получить низкое соотношение попадания, требуя много вычислений и обеспечивая незначительные улучшения производительности.
Следовательно, вы хотите выбрать высокий ключ кардинальности, избегая никогда не повторяющихся, но не маленьких, избегая ограниченных. Одним из способов, которым многие используют для достижения этого баланса, является использование сложных ключей (например, карта или списка), смешивая средний ключ кардинальности, такой как идентификатор клиента, с низким уровнем кардинальности, как имена состояний.
Один сценарий, который вы должны быть осторожны, — это записать. Для тех, кто поступает с земель ОО, это метод кэширования значений, рассчитанных по функции. Он использует аргументы функции в качестве ключей и кэширует результат. Но, поскольку функция может измениться со временем, и вы можете использовать решение, которое завершает функцию в месте, далеко от локального здесь, оно реализовано, существует большой риск, который некоторые функции или рефакторинг добавляет уникальные аргументы (например, метка времени) или Уменьшите аргументы до низких кардиналов (небольшой перечисление и логический). Вы должны реализовать памятку рядом с реализацией и/или использовать решения кэша, которые позволяют вам выбрать ключи из списка аргументов, что является лучшим решением, поскольку нельзя случайно случайно это.
Алгоритмы и стратегии кэша
Затем вам необходимо понять шаблон доступа, чтобы выбрать ваш алгоритм кеша и возможные стратегии. У каждого из них будут компромиссы, вы можете объединить некоторые из них, и вы должны экспериментировать, потому что в этой области данные будут лучше направлять вас.
- ФИФО (сначала в первую очередь) : Это самый простой алгоритм, в котором кэш работает как очередь, и вызывает первый блок, независимо от того, сколько раз он использовался. Со временем у вас будут наиболее используемые ключи, оставшиеся в кэше, так как даже если был выселен блок, поскольку он высоко используется, дублированные блоки этого ключа будут представлены в очереди. Эта стратегия действительно проста в реализации и имеет низкие накладные расходы, но также имеет неэффективное использование памяти по сравнению с другими алгоритмами.
- LRU (наименьшее недавно используемое) : Вероятно, самый используемый алгоритм кеша, он отслеживает, когда использовался какой -то блок, и выясняют тот, который с меньшим количеством доступа. Следовательно, он сохраняет наиболее используемые клавиши в кэше, но с лучшим использованием памяти. В качестве компромисса он имеет более сложную и дорогостоящую реализацию, поскольку он должен добавлять и отслеживать возрастные биты в блоках кэша.
- LFU (наименее часто используется) : Представьте, что вы используете кэш LRU, и у вас есть 100 доступа в последнюю секунду. В ключе A было 80 попаданий в ключе A, 19 попаданий в ключе B и 1 в ключе C. Если ваш кэш будет заполнен, в следующей промахе необходимо загрузить новый ключ, ваш кэш не выиграл бы C, потому что он был самым последним доступным. Это может быть действительно плохо, так как мы, вероятно, удаляем более ключ использования (A или B) в пользу C. Это проблема, согласно которой алгоритм LFU обращается, поскольку он сохраняет наиболее частые клавиши использования, это выяснило бы ключ C из нашего примера, потому что он имеет небольшую частоту доступа. Это действительно интересная модель, и, вероятно, лучше подходит для большинства случаев использования, но в качестве шаблона она также имеет больше накладных расходов, чем LRU, потому что как он должен отслеживать, сколько раз доступ к блоку в отношении того, сколько происходит доступ в кеш.
- Ttl (время жить) : Одна действительно распространенная стратегия-это время для жизни, алгоритм, который высекает блоки, которые старше, чем определенный предварительно определен. Он используется для более нестабильных данных и, как правило, с двумя случаями: для клавиш низкой кардинальности, которые не могут увеличить следум больше возможностей для обновления.
- Устаревшие данные : Мы говорим, что блок устареет, когда он проходит время истечения срока действия и должен быть выселен или обновляется. Стратегия устаревшей данных — это увеличение TTL, которое вместо того, чтобы исключить блок из кэша после истечения времени для жизни, она выполняет функцию обновления (в случае меморизации, она повторяет функцию), которая будет вычислять новое значение для ключа. В течение этого времени устаревшие (старые) данные обслуживаются для тех, кто получает доступ к кешу. Это также может быть тот случай, когда, если функция обновления не удается, она просто поддерживает блок в кэше, который может быть выселен с помощью некоторого алгоритма, но не устраняется его истечением. Это может быть действительно мощной стратегией повышения устойчивости, если ваша система поддерживает жизнь с возможными долгожившими устаревшими данными.
Кроме того, есть также более современные алгоритмы, такие как оконные Tinylfu (используется кофеин ), Lirs и Дуг Анкет Обратите внимание, что различные дискуссии об алгоритме кеша будут ссылаться на теоретический Алгоритм Белади Так хорошо взглянуть на это.
Местный против распределенного
Последний вопрос, на который вам может потребоваться ответить, — если вы собираетесь использовать локальный или распределенный кэш. Это будет самый важный вопрос в финансовом плане, поэтому посмотрите на ваши потребности.
Местный : Это означает, что вы будете поддерживать данные в памяти экземпляра приложения. Это самая простая настройка, но она может наложить бремя в выделенной оперативной памяти, возможно, заставив вас перейти на больший экземпляр, что может быть довольно дорогим. Он также может иметь неоптимальную производительность, поскольку наихудший сценарий для кэша с пределом размера 1000 клавиш-это просто хранить во всех случаях, то есть одни и те же данные воспроизводятся во всех локальных кэшах. Это пересечение уменьшает общий прирост производительности в вашей системе.
Распространено : В этом случае можно использовать решение, такое как Redis или Memcache, работающий отдельно от приложения и поделился всеми экземплярами. Это решение оптимизирует использование ресурса (ОЗУ выделяется исключительно для кеша), позволяет для больших записей кэша и улучшает плотность данных (там нет более реплицированных записей), но даже тогда оно может быть менее эффективным, чем локальное решение, так как оно. Требует сетевой переключения обработки данных для доступа к базе данных. Кроме того, стоимость поддержания новых экземпляров и навыки, необходимых для их работы, не следует упускать из виду.
Все эти пункты должны быть приняты во внимание при выборе дизайна для вашего кеша в вашей системе.
Вывод
Поэтому, прежде чем изучать учебные пособия и начинать статьи о том, как настроить свой кэш, подумайте и обсудите свою проблему и о том, как вы могли бы настроить кэш, чтобы обеспечить наибольшую ценность для вашей системы. Вы можете использовать эти и другие руководящие принципы в качестве отправных точек для дебатов и сосредоточиться на руководстве ваших решений на основе данных, измеренных по вашей реализации.
Я надеюсь, что вы нашли это полезным, и вы можете найти больше моих мыслей в caioferreira.dev
Оригинал: «https://dev.to/caiorcferreira/introducing-cache-in-your-system-58j7»