Произошло двойное 11, кэш-лавина, пробитие, поломка, как вы спасаетесь

Redis

предисловие

В современном Интернете,高并发,大数据量,大流量стал одобрением, то наш系统также страдать巨大的压力, первое решение состоит в том, чтобыredis.

Тогда неправильное использование Redis приведет к雪崩,穿透,击穿И так далее, это тоже тест программиста技术能力момент.

Конечно, во время интервью高频面试题, спросит почти каждый крупный производитель. следуйте ниже贴心老哥Давайте посмотрим на эти технологии вместе.

Кэш Лавина

Пример

Во время Double Eleven все пользователи будут заходить на Taobao, как только откроют Taobao.首页, нагрузка на домашнюю страницу очень высока, чтобы улучшить параллелизм, веб-сайт首页数据кэшируются вredisВ, все ключи Redis失效时间оба3小时.

Большое количество пользователей на Double Eleven剁手狂欢, в это время прошло 3 часа, ключ главной страницы в redis缓存全部失效, в настоящее время данные не могут быть запрошены в Redis и могут быть отправлены только в数据库Запрос в середине, из-за чего база данных не отвечает挂掉.

Пользователи не могут зайти на домашнюю страницу и не могут покупать свои руки.马爸爸Сразу不开心, назначьте этого программиста非洲.

резюме в одном предложении

существует高并发Далее большое количество кэшированных ключей хранится в同一时间失效, большое количество запросов падает непосредственно на базу данных, в результате чего база данных выходит из строя.

решение

  • Произвольно установите срок действия ключа, чтобы избежать коллективного отказа большого количества ключей.
setRedis(Key,value,time + Math.random() * 10000);
  • Если он развернут в кластере, горячие данные могут быть равномерно распределены по разным библиотекам Redis, чтобы избежать проблемы сбоя всех ключей.

  • Не устанавливайте срок годности

  • Запускайте запланированные задачи и очищайте новый кеш до истечения срока его действия.

проникновение в кеш

Пример

Чувак сделал сайт火了, передвинул чужой торт и начал疯狂攻击сайт бро, спасибо бро网络安全Отсутствие академических навыков использовалось другими.

Кто-то использовал скрипт, чтобы отправить запрос моему сумасшедшему брату, запросid = -1данные, у Redis нет таких данных, на этот раз穿透redis, прямое попадание数据库начальство.

Посреди ночи мой брат спал и не заметил этого, всю ночь яростно нападал на моего брата.数据库Повесь трубку, тогда братан网站тоже повесился.

резюме в одном предложении

redis缓存и数据库В нем нет релевантных данных (например, пользователь напрямую приноситid<=0Параметры продолжают инициировать запросы), в redis таких данных нет,无法进行拦截, проникает непосредственно в数据库, что приводит к чрезмерной нагрузке на базу данных и простоям.

решение

  • Кэшируйте несуществующие данные в Redis, установите для ключа и значения значение null (независимо от того, являются ли данные нулевыми или системной ошибкой) и установите краткосрочный период истечения срока действия, чтобы время истечения срока действия не повлияло на обычных пользователей.

  • Заблокировать IP-адрес

  • Проверить параметры и перехватить недопустимые параметры

  • Фильтр Блума хэширует все возможные данные в достаточно большое растровое изображение, и данные, которые не должны существовать, будут перехвачены этим растровым изображением, что позволяет избежать нагрузки запросов на базовую систему хранения.

разбивка кеша

Пример

двойной одиннадцать马爸爸каприз, подумай拍卖Своя穿了20年的老布鞋, а с моей подписью программист сохраняет информацию о обуви в redis, и устанавливает3小时Истекший. Им хватило трех часов размышлений, чтобы схватить его, но он недооценил обаяние Папы Ма.

Продукт привлек внимание 10 миллионов человек, и эти люди продолжали делать ставки на эту пару обуви, и цена становилась все выше и выше.

делать ставку2小时59Я собираюсь снять 100 миллионов, и вдруг ключевые данные этой пары обуви в Redis过期了, что приводит к большому количеству запросов ключа к базе данных, что напрямую приводит к зависанию базы данных, и служба не может ответить.

Аукцион окончен, туфли не проданы, а папа Ма снова недоволен.外派到非洲.

резюме в одном предложении

某一个Горячая клавиша постоянно поддерживает высокую степень параллелизма.失效的一瞬间, постоянный высокий одновременный доступ击破缓存Прямой доступ к базе данных, приводящий к простою базы данных.

решение

  • Установите для данных точки доступа «бесконечный срок действия»

  • Добавьте блокировку мьютекса: описанное выше явление заключается в том, что несколько потоков одновременно запрашивают данные базы данных, тогда мы можем использовать блокировку мьютекса в первом запросе данных запроса, чтобы заблокировать его.

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

окончательное резюме

Лавина大面积Кэш ключей недействителен; проникновение в Redis不存在Этот ключ кеша; разбивка по redis某一个热点Ключ внезапно выходит из строя, и конечной жертвой становится база данных.

считать

未雨绸缪: встраивайте Redis, MySQL и т. д. в высокодоступный кластер, чтобы избежать единой точки.

亡羊补牢: Текущий лимит + понижение в сервисе для предотвращения сбоя MySQL.

重振旗鼓: Redis сохраняет RDB+AOF, перезапускается при простоях, автоматически загружает данные с диска и быстро восстанавливает кэшированные данные.

Обратите внимание на публичный аккаунт WeChat: IT-брат

Ответ: Видеоруководство по практическому проекту Java: вы можете получить 200G, 27 комплектов видеоурока по практическому проекту

Re: Маршрут обучения Java, вы можете получить самую последнюю и самую полную дорожную карту обучения

Re: Java eBook, вы можете получить 13 обязательных к прочтению книг для лучших программистов

Ответ: полный набор учебных пособий по Java, которые вы можете получить: основы Java, веб-приложение Java, все учебные пособия по JavaEE, включая весеннюю загрузку и т. д.

Re: Шаблон резюме, вы можете получить 100 красивых резюме

В этой статье используетсяmdniceнабор текста