Некэшированные дни:
Для Интернета это количество пользователей и количество посещений, которые поддерживают изменение и продвижение технологии проекта. По мере увеличения числа пользователей услуг. Некоторые ситуации, которые могут возникнуть:
- Не так много параллелизма страниц и посещений, mysql
足以支撑
Развитие собственной логики бизнеса. Тогда можно вообще не добавлять кеш. Кэшировать можно не более статических страниц. - Параллелизм страниц значительно увеличился, база данных находится под некоторым давлением, а некоторые данные обновляются реже.
反复被查询
или скорость запроса较慢
. Затем вы можете рассмотреть возможность использования технологии кэширования для оптимизации. Для объектов с высоким уровнем обращений, хранящихся в Redis в виде ключ-значение, при попадании данных можно сохранить неэффективную базу данных. Найдите данные из эффективного Redis. - Конечно, могут возникнуть и другие проблемы: вам может понадобиться локальное кэширование статических страниц, ускорение CDN и даже балансировка нагрузки для улучшения параллелизма системы. Здесь не делается введение.
Кэш-идеи повсюду
Давайте начнем с алгоритмической задачи, чтобы понять, что означает кэширование.
Вопрос 1:
- Введите число n (nn!;
Анализ 1:
- Просто рассмотрите алгоритм, а не числовую проблему выхода за границы.
Конечно, мы знаемn!=n * (n-1) * (n-2) * ... * 1= n * (n-1)!
;
Тогда мы можем решить проблемы с рекурсивной функцией.
static long jiecheng(int n)
{
if(n==1||n==0)return 1;
else {
return n*jiecheng(n-1);
}
}
Таким образом, каждый входной запрос должен быть выполненn
Второсортный.Вопрос 2:
- Введите группы данных (может быть, сотни или тысячи), каждая группа имеет X (N x!;
Анализ 2:
- При использовании
递归
, Введите t групп данных, каждый бит x, затем выполняйте каждый раз
Xi
когда ХiСлишком большое или слишком большое n создаст большую нагрузку!时间复杂度
заO(n^2^)
- Так ты можешь передумать. да, да
打表
(Также поймите немного动态规划
). Табулирование часто используется в алгоритмах ACM и часто используется для решения нескольких наборов входных и выходных данных, результатов поиска по теории графов и проблем с хранением путей. Итак, найдите факториал для этого. Нам просто нужно применить массив. Каждые данные前一个数据
*当前index
. Итак, идея очень ясна!
import java.util.Scanner;
public class test3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
long jiecheng[]=new long[21];
jiecheng[0]=1;
for(int i=1;i<21;i++)
{
jiecheng[i]=jiecheng[i-1]*i;
}
for(int i=0;i<t;i++) {
int x=sc.nextInt();
System.out.println(jiecheng[x]);
}
}
}
- временная сложностьO(n). Идея здесь
缓存
Мысли примерно такие же. Сначала сохраните данные в массиве jiecheng[21]. Выполните расчет. Когда вы продолжите обращаться к нему позже, это эквивалентно запросу значений статического массива. равно О (1). Это может значительно снизить затраты на запросы и выполнение!
Сценарии применения кэша
- Кэш подходит для сценариев с высокой степенью параллелизма и повышает пропускную способность службы. в основном из
经常被访问的数据
или запрос成本较高
Из среды хранения, чтобы замедлить более быструю среду, например硬盘
—>内存
. Мы знаем, что большинство реляционных баз данных基于硬盘读写
Да, его эффективность и ресурсы ограничены, а нереляционные типы, такие как Redis, основаны на хранении в памяти. Его эффективность варьируется в широких пределах. Разумеется, кеш тоже делится на локальный и серверный, здесь упоминается только серверный кеш redis. - Например. Например, если запрос интерфейса sql
需要2s
. Каждый раз, когда вы запрашиваете, это занимает 2 секунды, и он будет ждать при загрузке.Опыт этого длительного ожидания пользователя非常糟糕
из. То, что пользователи могут принять, часто第一次
Ждать. Если вы используете технологию кэширования. Ваш первый запрос в Redis внутри. Затем данные обратно вам от Redis. Назад, когда вы продолжаете доступ к этим данным. Redis Query на резервную копию, затем不需要通过db
напрямую从redis
для получения данных. Итак, подумайте, сколько времени потребуется, чтобы получить от Nosql значение ключевого значения! - Таким образом, для приличных, несколько масштабируемых сайтов кэширование
necessary
.redis также необходим. И конструкция кэша сервера также различается в зависимости от бизнеса. Это также необходимо для предотвращения таких проблем, как слишком много памяти и лавин Redis.
Вопросы, о которых следует знать
- Неправильное использование кэша может вызвать множество проблем. Поэтому необходимо тщательно продумать и продумать некоторые детали. Автор не очень разбирается в дистрибутивах, поэтому я расскажу о проблемах, которые в глазах автора вызовет плохой дизайн кеша.
Использовать ли кеш
- Сейчас многие проекты кешируются под кеш, но кеш подходит не для всех сценариев, например, если
数据一致性
очень требовательный или数据频繁
Изменений и запросов не много. Некоторые могут не требовать кэширования. Потому что, если вы используете кеш Redis более или менее, вы можете столкнуться с проблемами согласованности данных. Затем вы можете рассмотреть возможность использования Redis для создания распределенных блокировок для блокировки данных sql. Точно так же, если данные часто обновляются, то эффект Redis — это просто еще одна станция передачи. вместо浪费资源
. Делает процесс передачи раздутым.
Выбор политики истечения срока действия
- большинство сцен
不适合缓存一致存在
Во-первых, содержимое вашей базы данных sql может не сказать о многом, кроме того, чтобы вернуться к вашему объекту, если объект завершен, pojo в порядке, но если в результате используется множество различных параметров, связанных с проверкой, хранилище затем будет перераспределено. слишком холодные данные. След так и не уничтожен. Мы выучили操作系统
также знаю, что в компьютере缓存实现
in) алгоритм «первым пришел – первым вышел» (FIFO); наименее недавно использовавшийся алгоритм (LRU); лучший алгоритм исключения (OPT); алгоритм наименее посещаемых страниц (LFR) и другие алгоритмы планирования дисков. Его также можно использовать для веб-разработки. Лучше всего реализовать FIFO на основе времени. потому что редис в全局key
Политики истечения срока действия поддерживаются. - и развитие также может столкнуться
其他问题
. Например, при выборе срока действия, если он слишком длинный, это приведет к агрегации данных. Слишком малое количество может привести к частым запросам к базе данных или даже лавинному кэшированию. - Поэтому необходимо установить политику истечения срока действия. и для
关键key
должен小心谨慎设计
.
Проблема согласованности данных ★
Собственно, проблема непротиворечивости данных упоминалась выше. Кэширование не рекомендуется, если требования к согласованности чрезвычайно высоки. Давайте немного разберем кэшированные данные. Проблемы согласованности данных часто возникают в кэшах Redis. для кэша. Ниже перечислены
читать
read
: Чтение из redis, если нет redis, то получить обновление кеша redis из mysql.
Должен流程图
Опишите общие сценарии. Вообще никаких споров.
Запись 1: сначала обновить базу данных, а затем обновить кеш (обычный низкий параллелизм).
- Обновите информацию базы данных, а затем обновите кэш Redis. Это нормальная практика, кеш базируется на БД, взятой из БД. Но могут возникнуть некоторые проблемы. Например, если указанный выше кэш обновлений выйдет из строя (время простоя и другие условия), это приведет к тому, что база данных и Redis
数据不一致
.Причина БД новые данные, кеш старые данные.
Запись 2: сначала удалите кеш, затем запишите в базу данных (оптимизация с низким параллелизмом)
решенная проблема
- Этой ситуации можно эффективно избежатьнаписать 1Проблема в предотвращении сбоя записи в redis. Удалите кеш для обновления. В идеале оставить следующий визит к redis пустым
mysql
Получить последнее значение в кэш. Но эта ситуация ограничена сценариями с низким параллелизмом и不适用
Сценарии с высокой степенью параллелизма.
существующие проблемы
- Напишите 2, хотя в состоянии
看似写入redis异常的问题
. Это кажется хорошим решением, но в решениях с высоким параллелизмом все еще есть проблемы. мы внаписать 1Обсуждалось, что неудачное обновление кэша может привести к грязным данным, если обновление библиотеки прошло успешно. Наш идеал - удалить кеш下一个线程
Доступ для обновления кеша. Вопрос: если этоСледующий тред слишком ранний, слишком умныйкакие?
- Из-за многопоточности вы не знаете, кто первый, кто быстрее, а кто медленнее. Как показано на рисунке выше, будут несоответствия между данными кэша Redis и mysql. Конечно, вы можете сделать
上锁
. Однако такая тяжеловесная блокировка оказывает большое влияние на функцию параллелизма, поэтому не используйте ее, если вам не нужна блокировка! Вышеупомянутая ситуация по-прежнему будет вызывать высокий параллелизмКэш — старые данные, БД — новые данные. И если срок действия кеша не истечет, проблема будет всегда.
Запись 3: стратегия отложенного двойного удаления
- Это стратегия отложенного двойного удаления, которая может быть облегчена внаписать 2В процессе обновления mysql вступают потоки чтения, что приводит к несоответствию кеша Redis с данными mysql. Путь это
删除缓存
->更新缓存
->延时(几百ms)(可异步)再次删除缓存
. Происходит даже при обновлении кешанаписать 2Проблема. Вызывает несогласованность данных, но задержку (конкретно зависит от бизнеса, как правило, несколько сотен мс) можно быстро устранить, удалив его снова. - Тем не менее, есть все еще лазейки в плане, например,
第二次删除错误
,多写多读高并发
В случае давления на доступ к mysql и так далее. Конечно, вы можете использовать очередь сообщений, такую как mq, для асинхронного решения. На самом деле, фактическое решение трудно принять во внимание, поэтому不少大佬在设计
Эта часть может быть связана с一些纰漏
встреча被喷
. Как автор Cai Cai, я не буду здесь безобразным.Стратегия состоит только в том, чтобы дать набросок, а конкретный дизайн все еще должен быть отработан и изучен моей собственной командой. А также есть различия в уровне требований к согласованности.
Запись 4: непосредственное управление кешем и регулярная запись sql (подходит для высокой степени параллелизма)
- когда есть
一堆并发(写)
После отказа от первых нескольких решений пользователям будет сложно работать с ними комфортно, даже если они используют очереди сообщений для асинхронной связи. И масштабная работа SQL также вызовет большую нагрузку на систему. Поэтому другим решением является непосредственное управление кешем и регулярная запись кеша в sql. Поскольку Redis является нереляционной базой данных, основанной на операциях с памятью, KV намного быстрее, чем традиционный реляционный тип (значение может столкнуться максимум несколько раз).
- Вышеупомянутое подходит для бизнес-дизайна в условиях высокой параллелизма, в настоящее время данные Redis являются основными данными, а данные MySQL — вспомогательными. Периодически вставляйте (например, репозиторий резервных копий данных). Конечно, такой высокий параллелизм часто вызван бизнес-процессами.
读
,写
заказ и т. д. могут иметь разные требования, а также могут использовать消息队列
а также锁
Завершение работы по данным и заказу может быть связано с高并发、多线程
неопределенность и нестабильность. Повысить надежность бизнеса.
Короче говоря, чем больше高并发
, тем правильнее数据一致性要求高
Схема должна быть в схеме проектирования согласованности данных考虑和顾及
из越复杂、越多
. Вышеизложенное также является обучением автора и саморасхождением (бессмыслицей) для проблемы согласованности данных Redis. Если есть какое-либо объяснение или понимание является необоснованным или свяжитесь с нами, чтобы сообщить нам!
Кэш проникновение, кэш-лавина и пробоя кеша
Если вы не понимаете, вы можете не понимать этих понятий, и это звучит слишком высокопарно.По крайней мере, я так думал в начале.Эта статья не является подробным введением в то, как решить и отточить решения, но что более важно, понимание и познание.
проникновение в кэш Redis
понимать
- сконцентрируйся
穿透
Ну то есть доступ напрямую проходит через mysql через redis, которого обычно нетkey
, запрос в базе данныхnull
. Каждый запрос попадает в базу данных и является высококонкурентным. Если база данных не выдержит, она зависнет.
решение
- Найденный нуль можно установить в качестве объекта кеша ключа.
- Конечно, это можно сделать и на логическом уровне по заведомо неверному ключу.
验证
. - В то же время вы также можете анализировать поведение пользователя, будь то преднамеренный запрос, поисковый робот или злоумышленник. Ограничить доступ пользователей.
- Другие и так далее, например, просмотр других фильтров с фильтрами Блума (хеш-карты большого размера).
лавина кеша Redis
понимать
- лавина,
东西蜂拥而至
Значит, как лавина. Здесь это коллективный кеш Redis.大规模集体失效
, В случае высокого уровня параллелизма ключ внезапно обращается к mysql в большом масштабе, что приводит к сбою базы данных. представьте себе страну人口老年化
. В будущем люди будут концентрироваться в 70-80 лет, и никто не будет работать. Национальная рабочая сила создает давление.
решение
- Обычное решение — добавить ключ на время истечения
随机数
, чтобы ключи аннулировались равномерно. - Рассмотрите возможность использования очередей или блокировок, чтобы снизить нагрузку на выполнение программы.Конечно, это решение может повлиять на степень параллелизма.
разбивка кеша Redis
понимать
- Пробой отличается от проникновения, проникновение означает идею
绕过
Redis, чтобы вызвать сбой базы данных. А поломку можно понять как正面刚
Разбивка, которая обычно представляет собой большое количество одновременных операций чтения и записи по ключу. Этот ключ запрашивает большое количество запросов к базе данных в течение периода аннулирования кэша, создавая слишком большую нагрузку на базу данных и вызывая ее сбой. Сразу比如
В сценарии seckill заказ на 100 юаней за 10000-долларовый макинтош и 100-долларовый макинтош точно будет раскуплен. Таким образом, сбой кеша означает, что большое количество запросов общего ключа приводит к сбою базы данных.
решение
- Существует не так много компаний, которые могут реализовать этот сценарий, и я не знаю их конкретных методов обработки, но запрос на перехват блокировки всегда может предотвратить сбой базы данных.
резюме и понимание
-
На самом деле кэш кажется простым для понимания, но на самом деле схема его проектирования очень проста.
有学问
. В детальном проекте вы также столкнетесь с очередями сообщений, фильтрами Блума, распределенными блокировками, снижением качества обслуживания, автоматическими выключателями и шунтированием. Есть даже обработка кеша缓存预热
(Заранее кэшируйте некоторые горячие данные, чтобы предотвратить сбой службы из-за всех попаданий в кэш в начале) и другие популярные термины и проблемы здесь не будут представлены. -
Кроме того, с точки зрения дизайна тайника, личных ощущений и
操作系统
изУправление хранилищеми замки, с которыми вы можете столкнуться, разработаны сСначала читатели, сначала писателиЕсть отличные отношения, каждый может обратиться и обменяться! -
Конечно, содержание redis очень глубокое, уровень автора ограничен, в некоторых местах могут быть ошибки, просьба указать или сообщить. Конечно, эта статья в основном является личным пониманием автора и неизбежны упущения. В то же время перед написанием этой статьи я также читал некоторые статьи предшественников, чтобы узнать (отвернуться и не знаю, кто является оригиналом, поэтому не ставьте ссылку), пожалуйста, дайте мне еще совет!
-
если правильно
后端、爬虫、数据结构算法
Если интересно, прошу обратить внимание на мой личный паблик аккаунт для связи:bigsai