Я Редис
Привет, я Редис, человек по имени Антирез привел меня в этот мир.
Если говорить о моем рождении, то оно вполне связано с реляционной базой данных MySQL.
До того, как я пришел в этот мир, у MySQL была очень тяжелая жизнь, интернет развивался все быстрее и быстрее, он вмещал все больше и больше данных, и запросы пользователей тоже росли, и каждый запрос пользователя менялся, он стал читать и писать один за другим. операций на нем, MySQL убогий. MySQL страдает особенно во времена ажиотажа с покупками «Double 11» и «618».
Согласно тому, что MySQL сообщил мне позже, на самом деле более половины пользовательских запросов являются операциями чтения, и они часто запрашивают что-то повторно, тратя много времени на дисковый ввод-вывод.
Позже некоторые люди задавались вопросом, можно ли узнать ЦП и добавить кэш в базу данных? Так я родился!
Вскоре после нашего рождения я подружился с MySQL, и мы вдвоем часто появлялись вместе на внутреннем сервере.
Зарегистрируйте у меня данные, которые приложения запрашивают из MySQL. Когда вам понадобится их использовать позже, вы можете сначала запросить их у меня, и я не прошу здесь MySQL.
Для удобства использования я поддерживаю хранение нескольких структур данных:
String
Hash
List
Set
SortedSet
Bitmap
······
Поскольку я записываю все зарегистрированные данные в память, мне не нужно выполнять операции ввода-вывода, которые медленны, как улитка, поэтому на поиск меня уходит больше времени, чем на поиск MySQL.
Но не стоит недооценивать это простое изменение, я могу облегчить нагрузку на MySQL! По мере работы программы я кэширую все больше и больше данных и блокирую запросы пользователей на них на значительный период времени.
С моим добавлением производительность веб-сервиса сильно улучшилась, благодаря тому, что я много снимался за базу данных.
Срок действия кэша и вывод кэша из эксплуатации
Но вскоре я обнаружил, что дела обстоят не очень хорошо, данные, которые я кэшировал, были все в памяти, но даже на сервере пространственные ресурсы памяти были все еще очень ограничены, и я не мог держать это так безудержно. чтобы найти способ.В противном случае принимайте таблетки мармелада.
Вскоре я придумал решение: установить тайм-аут для кешированного контента и оставить конкретную настройку приложениям для установки.Все, что мне нужно сделать, это удалить просроченный контент от меня и освободить место во времени. .
Тайм-аут истек, когда я должен сделать эту очистку?
Проще всего удалять регулярно, я решил делать это раз в 100мс, 10 раз в секунду!
Когда я убираюсь, я не могу удалить все просроченные за один раз.У меня в нем хранится много данных.Я не знаю, сколько времени потребуется, чтобы просмотреть его заново.Это серьезно повлияет на мой прием новых запросов клиентов!
Времени мало, а задача тяжелая, поэтому мне приходится случайным образом выбирать часть для очистки, если это может уменьшить нагрузку на память.
После такого периода времени я обнаружил, что некоторым ключевым значениям повезло, они не выбирались моим случайным алгоритмом каждый раз, и каждый раз выживали, меньше места в памяти! Отдыхающий!
Я не могу тереть глаза песком! Итак, на основе оригинального обычного удаления был добавлен еще один трюк:
Те ключевые значения, которые ускользнули от моего алгоритма случайного выбора, как только я обнаружу, что срок действия запроса истек, то я не буду вежливым и немедленно удалю его.
Поскольку этот метод запускается пассивно, он не будет выполняться без запроса, поэтому его также называют ленивым удалением!
Тем не менее, все еще есть некоторые ключи, которые ускользают от моего алгоритма случайного выбора и никогда не запрашиваются, что держит их на свободе! В то же время остается все меньше и меньше места в памяти.
И даже если я сделаю шаг назад, я могу удалить все просроченные данные.Если время истечения установлено на долгое время, память будет заполнена до того, как я ее очистю, и я должен принять таблетки мармелада, поэтому я должен подумайте об этом.
После долгих размышлений я, наконец, придумал большой трюк: стратегию устранения памяти, на этот раз я хочу решить проблему полностью!
Я предоставил приложению 8 стратегий выбора того, как я должен решать, когда у меня заканчивается память:
noeviction: ошибка возврата, значение ключа не будет удалено
allkeys-lru: использовать алгоритм LRU для удаления наименее использовавшихся ключей.
volatile-lru: используйте алгоритм LRU для удаления наименее использовавшегося значения ключа из набора ключей с установленным временем истечения срока действия.
allkeys-random: случайным образом удалить все ключи
volatile-random: случайным образом удалить из набора ключей с установленным сроком действия
volatile-ttl: удалить ключ с кратчайшим оставшимся временем из ключей с установленным временем истечения срока действия
volatile-lfu: удалить наименее часто используемые ключи из ключей, настроенных со временем истечения срока действия.
allkeys-lfu: удалить наименее часто используемый ключ из всех ключей
С вышеупомянутыми наборами комбинированных ударов мне больше не нужно беспокоиться о проблеме заполнения пространства слишком большим количеством просроченных данных~
Проникновение в кэш и фильтр Блума
Моя жизнь довольно комфортна, но мой старший брат MySQL не так удобен, как я.Иногда я сталкиваюсь с раздражающими запросами, запрашиваемые данные не существуют, и MySQL будет занят! Мало того, что его нет, я не могу его закешировать, так что каждый раз, когда приходит один и тот же запрос, мне приходится заставлять работать MySQL впустую. Мое значение в качестве кеша не отразилось! Это то, что люди часто называют проникновением в кеш.
Походив туда-сюда, старший брат MySQL не мог с этим поделать: «Эй, брат, не мог бы ты помочь мне найти способ заблокировать те запросы запросов, которые, как я знаю, не дадут результатов?»
В это время я подумал о другом моем хорошем друге: фильтре Блума.
У моего друга нет других навыков, поэтому он хорошо умеет быстро сообщать вам, существуют ли данные, которые вы ищете, из огромного набора данных (скажу вам тихо, этот мой друг немного ненадежен, если он говорит вам, что они существуют, вы не можете в это поверить до конца, На самом деле его может и не быть, но если он говорит вам, что его не существует, то его и не должно быть).
Если вас интересует мой друг, вы можете посмотреть здесь"Фильтр Народного Блума BloomFilter".
Я познакомил этого друга с приложением, и мне не пришлось заморачиваться с MySQL за несуществующие данные, что легко помогло решить проблему проникновения в кеш.
Разбивка кеша и лавина кеша
После этого прошел период мира, до того дня...
Однажды парень из MySQL свободно ловил рыбу, и вдруг к нему пришла куча запросов, которые застали его врасплох.
После того, как я некоторое время был занят, MySQL нашел меня сердито: «Брат, что происходит, почему это вдруг так жестоко?»
Я проверил журнал и быстро объяснил: «Брат, мне очень жаль, я просто удалил горячие данные, когда срок их действия истек. К сожалению, много запросов на эти данные пришли позже, вот и я. запросы отправлены вам"
«Что ты делаешь, в следующий раз будь внимательнее», — с недовольным выражением лица ушел Большой Брат MySQL.
Я не обратил особого внимания на это маленькое дело, а потом забыл об этом, но я никогда не думал, что через несколько дней я заколю корзину побольше.
В тот день к MySQL было отправлено большое количество сетевых запросов, что было намного больше, чем в прошлый раз.Старший брат MySQL некоторое время усердно работал, чтобы выйти из строя несколько раз!
После долгого ожидания прохождения этой волны трафика MySQL восстановился.
«Брат, в чем причина на этот раз?» Старший брат MySQL был измотан и потерял силы.
«На этот раз еще более неудачно, чем в прошлый раз. На этот раз срок действия большого количества данных истек одновременно, а затем было много запросов на эти данные, поэтому масштаб был больше, чем в прошлый раз».
Брат MySQL нахмурился: «Тогда ты должен придумывать способ мучить меня каждые три дня. Кто это выдержит?»
"Вообще я тоже очень беспомощен. Я не ставил это время. Почему бы мне не зайти в приложение и не попросить его установить время истечения кеша более равномерно? Хотя бы не пускать большой объем данных потерпеть неудачу коллективно»
«Давай, пойдем вместе»
Позже мы перешли к приложению, чтобы обсудить не только случайное время истечения срока действия значения ключа, но и установить бессрочный срок действия данных точки доступа, что сняло множество проблем. Ах да, мы еще назвали две проблемы: сбой кеша и лавина кеша.
Наконец-то у нас снова комфортная жизнь...
пасхальные яйца
В тот день я усердно работал, когда случайно допустил ошибку, и весь процесс потерпел крах.
Когда я снова запустил его, все ранее кэшированные данные исчезли, и все бурные запросы снова ударили по старшему брату MySQL.
Увы, если бы я только мог вспомнить, что было кэшировано до краха...
Если вы предсказываете, что будет дальше, обратите внимание на продолжение захватывающего...
Прошлые ТОП5 статей
ЦП явно имеет 8 ядер, почему сетевая карта отчаянно кидает ядро №1?
Я чуть не потерял работу из-за запроса о перекрестном происхождении
Сделанный! Процессор слепо требует, чтобы что-то произошло в ближайшее время!
Какая хеш-таблица сильнее? Несколько основных языков программирования спорят!