Чат Redis (1): построение графа знаний

Redis

在这里插入图片描述

Сценарий: интервью Redis

在这里插入图片描述
(картинка взята из интернета)

интервьюер: Я увидел в вашем резюме, что вы умеете пользоваться Redis, так для чего же используется Redis?

Сяо Мин: (Я в восторге, разве Redis не кеш?) Redis в основном используется в качестве кеша для эффективного хранения непостоянных данных в памяти.

интервьюер: Можно ли использовать Redis в качестве постоянного хранилища?

Сяо Мин: Ну... должно быть возможно...

интервьюер: Как Redis выполняет постоянные операции?

Сяо Мин: Хм... не слишком ясно.

интервьюер: Каковы механизмы устранения памяти в Redis?

Сяо Мин: Хм... не понял

интервьюер: Что еще мы можем сделать с Redis? Какая инструкция Redis используется?

Сяо Мин: Я только знаю, что Redis также может делать распределенные блокировки, очереди сообщений...

интервьюер: Хорошо, давайте перейдем к следующей теме...

считать: Очевидно, что выступление Сяо Мина и ответ о Redis в процессе интервью должны быть относительно неудачными. Redis — это то, что мы используем каждый день в нашей работе, почему он теряется, когда дело доходит до интервью?

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

В этой статье обобщаются некоторые знания о Redis, есть принципы и приложения, и я надеюсь, что это может помочь всем.

1. Что такое Редис

REmote DIctionary Server (Redis) — это система хранения ключей и значений, написанная Сальваторе Санфилиппо.

Redis — это база данных типа «ключ-значение» с открытым исходным кодом, написанная на ANSI и C, соответствующая протоколу BSD, поддерживающая сеть, работающая в памяти и сохраняемая, а также предоставляющая API-интерфейсы на нескольких языках.

Здесь я цитирую описание Redis в руководстве по Redis, которое является официальным, но стандартным.База данных типа журнала, ключ-значение, которая может быть основана на памяти или постоянна.Я думаю, что это описание является подходящим и исчерпывающим.

1.1 Отраслевой статус Redis

Redis — это наиболее широко используемое промежуточное программное обеспечение для хранения данных в области интернет-технологий.Оно хорошо воспринимается с точки зрения хранения благодаря его сверхвысокой производительности, отличной документации, многогранным возможностям приложений и богатой и полной поддержке клиентов. стать самым популярным промежуточным программным обеспечением в этой области. Практически каждая компания-разработчик программного обеспечения использует Redis, в том числе многие крупные интернет-компании, такие как JD.com, Ali, Tencent, github и т. д. Таким образом, Redis также стал важным навыком для бэкэнд-разработчиков.

1.2 График знаний

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

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

知识图谱

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

Во-вторых, преимущества Redis

2.1 Быстро

Наиболее известная особенность Redis как инструмента кэширования заключается в том, что он быстрый. Одномашинный qps Redis (параллельность в секунду) может достигать 110 000 раз/с, а скорость записи — 81 000 раз/с. Итак, почему Redis такой быстрый?

  • Подавляющее большинство запросов — это операции с чистой памятью, которые выполняются очень быстро;
  • Многие структуры данных с очень быстрыми операциями поиска используются для хранения данных, а структуры данных в Redis специально разработаны. Например, HashMap, временная сложность поиска и вставки составляет O (1);
  • Использование одного потока позволяет избежать ненужного переключения контекста и условий конкуренции, а также нет потребления ЦП из-за переключения, вызванного многопроцессорностью или многопоточностью.Нет необходимости учитывать различные проблемы блокировки.Потребление производительности, вызванное возможными взаимоблокировками;
  • Используется неблокирующий механизм мультиплексирования ввода/вывода.

2.2 Богатые типы данных

Redis имеет 5 часто используемых типов данных: String, List, Hash, set, zset, каждый из которых имеет свою полезность.

2.3 Атомарность, поддерживающая транзакции

Redis поддерживает транзакции, и все его операции являются атомарными, а Redis также поддерживает атомарное выполнение нескольких объединенных операций.

2.4 Богатые возможности

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

3. Сравнение Redis и Memcache

Memcache и Redis — отличные и высокопроизводительные базы данных в памяти.Как правило, когда мы говорим о Redis, мы будем сравнивать Memcache с Redis. (Зачем проводить сравнение? Конечно, это нужно для того, чтобы показать, насколько хорош Redis. Без сравнения нет вреда~) Аспекты сравнения включают в себя:

3.1 Способ хранения

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

  • У Redis есть некоторые данные, хранящиеся на жестком диске, что может обеспечить постоянство данных.

3.2 Типы поддержки данных

  • Поддержка типов данных в Memcache относительно проста и поддерживает только структуры данных типа String.

  • Redis имеет богатые типы данных, в том числе: String, List, Hash, Set, Zset.

3.3 Используемая базовая модель

  • Базовая реализация между ними и протокол приложения для связи с клиентом различны.

  • Redis напрямую сам строит механизм ВМ, потому что общая система вызывает системные функции, которые будут тратить определенное количество времени на перемещение и запрос.

3.4 Размер хранимого значения

  • Redis может хранить до 1 ГБ, а memcache — всего 1 МБ.

Увидев это, вы думаете, что Redis особенно хорош, со всеми преимуществами и совершенством? На самом деле у Redis по-прежнему много недостатков, как мы обычно преодолеваем эти недостатки?

4. Проблемы и решения Redis

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

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

решать: Как мы можем гарантировать возможную согласованность?

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

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

4.2 Проблема лавины кэша

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

решать:

  • Добавить случайное значение при установке срока действия кеша.
  • Установите двойной кеш, кеш 1 устанавливает время кеша, кеш 2 не устанавливает, сразу возвращается к кешу 2 после истечения срока действия 1 и запускает процесс обновления кешей 1 и 2.

4.3 Проблема проникновения в кэш

проблема:Проникновение в кэш означает, что некоторые аномальные пользователи (хакеры) преднамеренно запрашивают данные, которых нет в кеше, в результате чего все запросы концентрируются на базе данных, что приводит к аномальным соединениям с базой данных.

решать:

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

  • Примите стратегию асинхронного обновления. Независимо от того, получает ли ключ значение, он возвращается напрямую. Время истечения срока действия кеша сохраняется в значении value.Если срок действия кеша истекает, асинхронно запускается поток для чтения базы данных и обновления кеша. Необходимо выполнить операцию прогрева кеша (перед запуском проекта сначала загрузить кеш).

  • Предоставляет механизм перехвата, который может быстро определить, является ли запрос действительным. Например, фильтр Блума используется для внутренней поддержки ряда действительных и действительных ключей и быстрого определения того, является ли ключ, переданный в запросе, действительным и действительным. Если он недействителен, он вернется напрямую.

4.4. Проблема конкурентного параллелизма кэша

проблема:

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

Например, в Redis мы храним значение, ключом которого является сумма, а его значение равно 100. Оба потока одновременно добавляют к значению 100, а затем обновляют его, правильный результат должен быть 300. Но когда два потока получают это значение, они оба равны 100, а конечный результат равен 200, что приводит к проблеме одновременной конкуренции кэшей.

решать

  • Если нет требований к порядку для многопоточных операций, мы можем настроить распределенную блокировку, и тогда несколько потоков конкурируют за блокировку, и тот, кто захватит блокировку первым, сможет ее выполнить первым. Эту распределенную блокировку можно реализовать с помощью zookeeper или самого Redis.
  • Вы можете использовать команду Redis incr.
  • Когда наши многопоточные операции требуют последовательности, мы можем настроить очередь сообщений, добавить в очередь сообщений нужные операции и выполнять команды строго в соответствии с последовательностью очереди.

5. Политика истечения срока действия Redis

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

Redis используетрегулярно удалятьиленивое удалениемеханизм устранения памяти.

5.1 Периодическое удаление

Существует разница между периодическим удалением и удалением по расписанию:

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

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

5.2 Ленивое удаление

Приведу простой пример: когда я учился в средней школе, у меня обычно было слишком много домашней работы, и я не мог ее закончить. Учитель сказал, что эта работа будет преподаваться в следующем классе. Вы все закончили ее? На самом деле, многие люди не закончили его, поэтому им нужно наверстать упущенное перед следующим занятием.

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

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

5.3 Механизм устранения памяти Redis

Как правило, в Redis существует 6 типов механизмов устранения памяти, как показано на следующем рисунке:

在这里插入图片描述

Итак, как нам настроить механизм устранения памяти Redis?

В Redis.conf мы можем настроить

# maxmemory-policy allkeys-lru

6. Резюме

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

Я считаю, что у всех есть какое-то представление о Redis.В следующей статье мы проанализируем структуру данных Redis, как реализован каждый тип данных и какие есть соответствующие команды.

Автор: Ян Хэн

источник:Технологический институт CreditEase