Лавина кеша Redis, проникновение в кеш, разбивка кеша, прогрев кеша

Redis

Кэш Лавина

определение

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

нормально обрабатывать:

正常访问图片.png

Выполнить процесс под лавиной кеша:

缓存雪崩.png

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

решать

очередь блокировки

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

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

Код:

// 缓存 key
String cacheKey = "userlist";
// 查询缓存
String data = jedis.get(cacheKey);
if (StringUtils.isNotBlank(data)) {
    // 查询到数据,直接返回结果
    return data;
} else {
    // 先排队查询数据库,再放入缓存
    synchronized (cacheKey) {
        data = jedis.get(cacheKey);
        if (!StringUtils.isNotBlank(data)) { // 双重判断
            // 查询数据库
            data = findUserInfo();
            // 放入缓存
            jedis.set(cacheKey, data);
        }
        return data;
    }
}

Рандомизировать время истечения срока действия

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

Код:

// 缓存原本的失效时间
int exTime = 10 * 60;
// 随机数生成类
Random random = new Random();
// 缓存设置
jedis.setex(cacheKey, exTime + random.nextInt(1000) , value);

Настроить кеш L2

Кэш L2 относится ко всему, кромеRedisсобственный кеш,Настройте еще один уровень кеша,когдаRedisПосле аннулирования сначала перейдите к кешу второго уровня.

Например, вы можете настроить локальный кеш, вRedisЕсли кеш недействителен, сначала запросите локальный кеш, а не базу данных.

Можно использовать локальный кешGoogleизGuava CacheНастройте его и получите стратегии вытеснения емкости и времени вытеснения, что является отличным классом инструментов кэширования.

Официальная китайская документация Guava Cache

image.png

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

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

определение

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

缓存雪崩-缓存穿透.png

решать

использовать фильтр

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

# Фильтр Блума Redis

Кешировать пустые результаты

Мы можем каждый раз сохранять данные, запрашиваемые из базы данных, в кеш.Чтобы улучшить взаимодействие с пользователем переднего плана (чтобы решить ситуацию, когда информация не может быть запрошена в течение длительного времени), мы можем установить кеш время пустых результатов должно быть короче, например, 3~5 минут.

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

определение

Разбивка кэша относится кКэш точки доступа просто выходит из строя в определенный момент, а затем в это время происходит большое количество одновременных запросов. В это время эти запросы вызовут огромную нагрузку на базу данных. Такая ситуация называется поломкой кеша.

image.png

решать

очередь блокировки

В соответствии с методом обработки блокировок кэш-лавины, блокировка выполняется при запросе к базе данных для буферизации большого количества запросов.

Набор никогда не истекает

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

прогрев кеша

Прогрев кеша не проблема, но при использовании кешаоптимизированное решение, это может улучшить взаимодействие с пользователем на переднем плане.

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

image.png

Есть три идеи реализации предварительного нагрева кеша:

  1. Напишите метод, который необходимо кэшировать в методе инициализации системы, чтобы система автоматически загружала и кэшировала данные при запуске.
  2. Смонтируйте метод, который необходимо кэшировать, на странице или внутреннем интерфейсе и вручную запустите прогрев кеша.
  3. Установите временные задачи для автоматического предварительного нагрева кэша через равные промежутки времени.

Ссылаться на

«Основные принципы и практика Redis»