Кэш Лавина
определение
Лавина кеша означает, что за короткий промежуток времени срок действия большого количества кешей одновременно истекает, что приводит к большому количеству запросов на прямые запросы к базе данных, что вызывает огромную нагрузку на базу данных..
нормально обрабатывать:
Выполнить процесс под лавиной кеша:
Видно, что при недействительном кеше большое количество запросов обходится напрямую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
На самом деле, в большинстве случаев мы используем локальный кеш для доступа сначала к локальному кешу, а затем к распределенному кешу (Redis
), потому что доступ к локальному кешу является самым быстрым и не требует сетевых издержек, но его необходимо обновлять в течение определенного периода времени, чтобы он соответствовал данным в распределенном кеше..
проникновение в кеш
определение
Средства проникновения в кэшНет данных в базе запросов и кеше, так как запрос к базе данных не содержит данных, результат не будет сохранен в кэше для обеспечения отказоустойчивости, поэтомуКаждый запрос будет запрашивать базу данных, эта ситуация называется проникновением в кэш.
решать
использовать фильтр
мы можемИспользуйте фильтры Блума, чтобы уменьшить количество запросов к базе данных, принцип фильтра Блума заключается в хэшировании данных базы данных вbitmap
середина,Перед каждым запросом используйте фильтр Блума, чтобы отфильтровать недействительные запросы, которые не должны существовать, чтобы избежать давления запросов, вызванного недействительными запросами к базе данных..
Кешировать пустые результаты
Мы можем каждый раз сохранять данные, запрашиваемые из базы данных, в кеш.Чтобы улучшить взаимодействие с пользователем переднего плана (чтобы решить ситуацию, когда информация не может быть запрошена в течение длительного времени), мы можем установить кеш время пустых результатов должно быть короче, например, 3~5 минут.
разбивка кеша
определение
Разбивка кэша относится кКэш точки доступа просто выходит из строя в определенный момент, а затем в это время происходит большое количество одновременных запросов. В это время эти запросы вызовут огромную нагрузку на базу данных. Такая ситуация называется поломкой кеша.
решать
очередь блокировки
В соответствии с методом обработки блокировок кэш-лавины, блокировка выполняется при запросе к базе данных для буферизации большого количества запросов.
Набор никогда не истекает
Для некоторых кэшей точек доступа мы можемНабор никогда не истекаетТаким образом можно гарантировать стабильность кеша, но следует отметить, что после изменения данных кэш хотспота должен вовремя обновляться, иначе это вызовет ошибки в результатах запроса.
прогрев кеша
Прогрев кеша не проблема, но при использовании кешаоптимизированное решение, это может улучшить взаимодействие с пользователем на переднем плане.
Прогрев кеша означает, что при запуске системы результаты запроса предварительно сохраняются в кеше, чтобы пользователи могли напрямую считывать их из кеша при последующем запросе, чтобы сократить время ожидания пользователя.
Есть три идеи реализации предварительного нагрева кеша:
- Напишите метод, который необходимо кэшировать в методе инициализации системы, чтобы система автоматически загружала и кэшировала данные при запуске.
- Смонтируйте метод, который необходимо кэшировать, на странице или внутреннем интерфейсе и вручную запустите прогрев кеша.
- Установите временные задачи для автоматического предварительного нагрева кэша через равные промежутки времени.
Ссылаться на
«Основные принципы и практика Redis»