Введение в кэш Redis и анализ распространенных проблем

Redis

Некэшированные дни:


在这里插入图片描述Для Интернета это количество пользователей и количество посещений, которые поддерживают изменение и продвижение технологии проекта. По мере увеличения числа пользователей услуг. Некоторые ситуации, которые могут возникнуть:

  1. Не так много параллелизма страниц и посещений, mysql足以支撑Развитие собственной логики бизнеса. Тогда можно вообще не добавлять кеш. Кэшировать можно не более статических страниц.
  2. Параллелизм страниц значительно увеличился, база данных находится под некоторым давлением, а некоторые данные обновляются реже.反复被查询или скорость запроса较慢. Затем вы можете рассмотреть возможность использования технологии кэширования для оптимизации. Для объектов с высоким уровнем обращений, хранящихся в Redis в виде ключ-значение, при попадании данных можно сохранить неэффективную базу данных. Найдите данные из эффективного Redis.
  3. Конечно, могут возникнуть и другие проблемы: вам может понадобиться локальное кэширование статических страниц, ускорение 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, затем выполняйте каждый раз

i=0t\sum_{i=0}^tXi
когда Х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Обсуждалось, что неудачное обновление кэша может привести к грязным данным, если обновление библиотеки прошло успешно. Наш идеал - удалить кеш下一个线程Доступ для обновления кеша. Вопрос: если этоСледующий тред слишком ранний, слишком умныйкакие?

正常时 线程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