Привет всем, я Сяолинь.
Прежде чем я это осознал, я написал множество статей из серии «Иллюстрированный Redis». Учитывая, что некоторые студенты брали интервью у Redis, я составил эссе Redis из восьми частей с 30 000 слов + 40 изображений и собрал более 40 вопросов для собеседования. всего.
Начнем!
контур
Давайте посмотрим, как Redis официально представляет себя.
Оригинальная версия официального введения Redis написана на английском языке. Я перевел ее на китайский язык и сделал скриншоты, поэтому часть текста может быть трудной для чтения. Это не имеет значения, я выделю наиболее важные функции и расскажу о них.
Redis Да, я основе Памятьизданные Библиотека,Операции чтения и записи данных завершены в дасуществовать Память.,поэтомуОчень быстрая скорость чтения и записи,частоиспользовать ВКэш, очередь сообщений, распределенная блокировка и другие сценарии。
Redis Предоставляет различные типы данных для поддержки различных бизнес-сценариев, таких как String (строка), Hash (хэш), List (список)、Установить (набор)、Zсет (заказной комплект)、Растровые изображения、HyperLogLog (статистика мощности)、ГЕО (географическая информация)、Stream(поток),и чтобыданныетипиз Все операциидаатомарностьиз,потому Команда чтоосуществлять обрабатывается одним пользователем, и проблем конкуренции за параллелизм не возникает.
Кроме того, Редис Также поддерживаетдела , настойчивость, Луа Скрипты, различные кластерные решения (репликация главный-подчиненныймодель、Режим охрана, режим кластера слайсеров), режим публикации/подписки, Механизм устранения память, механизм удаления истекшего срока действияи т. д.。
Многие говорят, что нужно использовать Redis в качестве кэша, но Memcached Это также база данных, основанная на памяти, почему бы не выбрать ее в качестве кэша? Чтобы ответить на этот вопрос, нам нужно выяснить Redis и Memcached разница. Redis и Memcached точки соприкосновения:
Redis и Memcached разница:
Главным образом потому, что Redis имеет две характеристики: «высокая производительность» и «высокий параллелизм».。
1. Redis имеет высокую производительность
Предположим, пользователь впервые обращается к некоторым данным в MySQL. Этот процесс будет медленнее, поскольку он считывается с жесткого диска. Кэшируйте данные, к которым обращается пользователь, в Redis, чтобы в следующий раз, когда вы получите доступ к данным, вы могли напрямую получить их из кеша. Работа с кешем Redis заключается в непосредственном управлении памятью, поэтому скорость довольно высокая.
если MySQL После изменения соответствующих данных они изменяются синхронно. Redis Соответствующих данных в кэше достаточно, но будут Redis и MySQL Вопрос согласованности двойной записи будет упомянут позже.
2. Redis имеет высокий уровень параллелизма
QPS (количество запросов в секунду, обрабатываемых в секунду) Redis на одном устройстве в 10 раз больше, чем у MySQL. QPS одной машины Redis может легко превысить 100 000, в то время как QPS одной машины MySQL затруднительно. превысить 10 000.
Таким образом, запросы, которые может выдержать прямой доступ к Redis, намного больше, чем запросы прямого доступа к MySQL, поэтому мы можем рассмотреть возможность переноса некоторых данных из базы данных в кеш, чтобы некоторые запросы пользователя попадали непосредственно в кеш без просматривая базу данных.
Redis предоставил Богатыйизданныетип,часто Видетьиз Есть пять видовданныетип:String (строка), Hash (хэш), List (список), Set (коллекция), Zset (упорядоченный набор)。
вместе с Redis В последней версии теперь поддерживаются четыре типа данных: BitMap(2.2 Новая версия), HyperLogLog (2.8 Новая версия), ГЕО (3.2 Новая версия), Стрим (5.0 новая версия)。 Redis Сценарии применения пяти типов данных:
Последующие версии Redis поддерживают еще четыре типа данных, а сценарии их применения следующие:
::: tip
Хотите узнать больше об этом 9 тип данных, вы можете прочитать эту статью: 20 000 слов. + 20 Картина | разрабатывать Redis часто Видетьданныетипиотвечатьиспользоватьсцена
:::
я нарисовал картинку Redis данныетипи Первый этажструктура данныеиз соответствует картинке уровня, да слева Redis Версия 3.0, которая называется «Redis В книге «Проектирование и реализация» поясняется из Версия, сейчас существует читать все еще немного устарело, право да сейчас существует Redis 7.0 версия.
Внутренняя реализация строкового типа
String Реализация базовой структуры данных этого типа в основном SDS (простая динамическая строка). SDS и Мы знаемиз C Строки разные, поэтому они не используются C Строковое представление языка, поскольку SDS по сравнению с C Родная строка:
Внутренняя реализация типа списка
List Тип нижней структуры данныхда Зависит отдвусвязный списокилисжатый списоквыполнитьиз:
носуществовать Redis 3.2 После версии, список Базовая структура данных типа данных состоит только из quicklist Реализован, замена двусвязного списокисжатый список。
Внутренняя реализация типа хеша
Hash Тип нижней структуры данныхда Зависит отсжатый списокили Хэш-таблицавыполнитьиз:
существовать Redis 7.0 , структура данных сжатого списка устарела и передана listpack структура данных Приходитьвыполнить Понятно。
Установить тип внутренней реализации
Set Тип нижней структуры данныхда Зависит отХэш-таблицаилинабор целых чиселвыполнитьиз:
ZУстановить тип внутренней реализации
Zset Тип нижней структуры данныхда Зависит отсжатый списокили Таблица прыжковвыполнитьиз:
В Redis 7.0 структура данных сжатого списка устарела и реализована структурой данных listpack.
::: tip
Хотите узнать больше об этом 9 вид структуры данных, вы можете прочитать эту статью: 20 000 слов. + 40 Картина | разрабатывать Структура данных Redis
:::
Redis одиннитьобратитесь кизда「Получить запрос клиента->запрос анализа ->руководитьданные Операции чтения и записи->отправлятьданныеклиенту」этотиндивидуальныйпроцессда Зависит отодининдивидуальныйнить(хозяиннить)завершить из,этоттакжеданасчастообъяснять Redis Это из-за одного потока.
но,Программа Redis — это не одна программа,Redis существоватьзапускатьизкогда,давстречаНачать фоновый поток(BIO)из:
Причина Redis Для «Закрыть файл, AOF Эти задачи по «прошивке диска и освобождению Память» созданы отдельно для решения, дапотому чтоэти задачи и операции отнимают очень много времени, если позволить этим задачам заняться основной нить, то. Redis Основной поток легко блокируется, и он не может обрабатывать последующие запросы.
Фоновый поток эквивалентен потребителю. Производитель бросает трудоемкие задачи в очередь задач. Потребитель (BIO) постоянно опрашивает очередь и выполняет соответствующий метод при извлечении задачи.
Три задачи закрытия файлов, очистки AOF и освобождения памяти имеют свои собственные очереди задач:
Однострочный режим до Redis версии 6.0 выглядел следующим образом:
Синяя часть на картинке — это цикл событий, который отвечает за основной поток. Вы можете видеть сеть. I/O И обработка команд — это все одно нить. Redis Во время инициализации будут выполнены следующие действия:
После инициализации,хозяиннить Просто введитеприезжатьодининдивидуальныйфункция цикла событий,В основном делайте следующие вещи:
Почему Redis так быстро работает в одном потоке?
Официальный тест результатов да,одиннитьиз Redis Пропускная способность может быть достигнута 10 Вт/секунду,Как показано ниже:
Причина Redis Использование одного потока (сеть I/O иосуществлять Заказ)Такбыстрый,Есть несколько причин:
Мы все знаем, что однопоточные программы не могут использовать преимущества многоядерности сервера. CPU Да, так рано Redis Основная работа версии (сетевая I/O иосуществлять Заказ)почему до сих пориспользоватьодиннить Шерстяная ткань?нас Нетвред Первыйсмотретьодин ВнизRedisОфициально предоставленоизFAQ。
ядерный Значениеда:CPU Не ограничение Redis Производительностьизузкое место Местосуществовать,Чаще всего да ограничивается местом проживания Памятьбольшая МаленькийисетьI/Oиз,Так что нет ничего плохого в модели Redis «ядерный набор».,если вы хотите использовать сервис на мощном процессоре,Вы можете запустить несколько серверов на одном сервере, используя метод шардирования.
В дополнение к официальному ответу выше, причины выбора однопоточности также имеют следующие соображения.
использовать Понятноодиннитьназад,Высокая ремонтопригодность,Отличная производительность в некоторых аспектах,но Это вносит процедурную неопределенность,Это привело к ряду проблем с одновременным чтением и письмом.,добавлена сложность системы、В то же время можно сохранить существование переключателя.、Даже заблокировать и разблокировать、Взаимная блокировка приводит к потере производительности。
Хотя Redis основная работа (сеть I/O (выполнить команду) в одной модели резьбы,носуществовать Redis 6.0 После версии несколько I/O Потоки для обработки сетевых запросов,Это дапотому чтовместе ссет Аппаратное обеспечение Улучшение производительности, Redis из Иногда возникают узкие места в производительности. I/O изобработка。
Итак, чтобы улучшить сеть I/O Степень параллелизма, Redis 6.0 для сети I/O Выбиратьиспользоватьмногонить Приходитьиметь дело с。нодлякоманда изосуществлять,Redis по-прежнему использует одну нить для обработки,Местокбольшой ДомНе поймите неправильно Redis Несколько потоков выполняют команды одновременно.
Официальное заявление Redis,Redis 6.0 Многопоточность введена в версии I/O Функции могут как минимум удвоить производительность。
Функция многопоточности ввода-вывода, поддерживаемая Redis версии 6.0. По умолчанию многопоточность ввода-вывода предназначена только для отправки данных ответа (клиентский сокет записи) и не обрабатывает запросы на чтение (клиентский сокет чтения) в многопоточном режиме. образом. Чтобы включить многопоточную обработку клиентских запросов на чтение, вам необходимо установить для элемента конфигурации io-threads-do-reads в файле конфигурации Redis.conf значение Yes.
//Запрос на чтение такжеиспользуем io больше нить
io-threads-do-reads да
В то же время файл конфигурации Redis.conf предоставляет элементы конфигурации для количества многопоточных операций ввода-вывода.
// io-threads N,выразить просветлениеиспользовать N-1 индивидуальный I/O многонить(хозяиннитьтакже Рассчитатьодининдивидуальный I/O нить)
io-threads 4
Что касается установки нити числа, официальная рекомендация даесли 4 ядерный CPU, рекомендуется установить количество потоков на 2 или 3,еслидля 8 ядерный CPU Рекомендуется установить количество потоков 6,Число нить должно быть меньше ядра ядра машины.,нить числа не в лучшую сторону.
поэтому, Redis 6.0 После версии Redis существоватьзапускатьизкогда,по умолчанию Состояние Внизвстречадополнительное создание 6 индивидуальныйнить(В число изниц здесь не входит основная нить.):
Redis все операции чтения и записи находятся в наличии Память, поэтому Redis производительность будет высокой, но когда Redis После перезапуска данные в памяти будут потеряны. Чтобы гарантировать, что данные в памяти не будут потеряны, Redis. выполнить Понятноданные Выносливостьизмеханизм,Этот индивидуальный механизм преобразует данныехранилищеприезжать на диск.,таксуществовать Redis Перезагрузка может восстановить исходные данные с диска.
Redis имеет три метода сохранения данных:
Redis существоватьосуществлять После завершения команды операции записи добавьте изспособ к команде воля к написатьодининдивидуальныйдокументвнутри,Затем Redis При перезапуске команды, записанные в файле, будут прочитаны, а затем поочередно будут выполняться команды для восстановления данных.
Здесь я использую "_set name команда xiaolin_" в качестве примера, Redis Узнать После этой команды существует запись AOF Содержимое журнала следующее:
Позвольте мне объяснить это вам здесь.
«*3» означает, что текущая команда состоит из трех частей, каждая часть начинается с «
3 set» означает, что эта часть имеет 3 байта, что соответствует длине строки команды «set».
Зачем сначала выполнять команду, а потом записывать данные в журнал?
Рейдс сначала выполняет команду операции записи, а затем записывает ее в журнал AOF. На самом деле это имеет два преимущества.
Конечно, это также сопряжено с рисками:
Сколько существует стратегий обратной записи AOF?
Давайте сначала посмотрим на процесс записи журналов AOF в Redis, как показано ниже:
Конкретно:
Redis предоставил 3 Эта стратегия обратной записи на жесткий диск управляет третьим шагом, упомянутым выше. существовать Redis.conf в файле конфигурации appendfsync Элементы конфигурации могут иметь следующее 3 Параметры могут быть заполнены:
Я также суммировал преимущества и недостатки этих трех стратегий обратной записи в таблицу:
Если журнал AOF слишком велик, какой механизм сработает?
Журнал АОФдаодининдивидуальныйдокумент,вместе Сосуществовать с командами операций записи все больше и больше, большой документ будет становиться все более и более большим. есликогда AOF Если файл журнала слишком велик, это приведет к проблемам с производительностью, например, к перезапуску. Redis После этого вам нужно прочитать AOF документировать содержимое для восстановления данных, если документ большой, весь процесс индивидуального восстановления будет очень медленным.
Итак, Редис во избежание AOF документ Чем больше я пишу, тем лучшебольшой,предоставил Механизм перезаписи AOF,когда AOF После того, как размер файла превысит установленный порог, Redis будет включен AOF Переписать механизм сжатия AOF документ.
Механизм перезаписи AOF дасуществоватьпереписать,читатькогдавпередданные Библиотекасерединаизвсеключпара значений,Затем Воля Каждыйодининдивидуальныйключпара значенийиспользоватьодинполоска Заказ Записыватьприезжать「новыйиз AOF файл", подождите, пока все записи будут завершены, а затем добавьте новый AOF файл заменяет существующий AOF документ.
Подниматьиндивидуальныйпример,существовать Нетиспользоватьпереписатьмеханизмвперед,гипотезавпередназадосуществлять Понятно「_set name xiaolin_」и「_set name xiaolincoding_" эти две команды будут записаны в AOF документ.
носуществоватьиспользоватьпереписатьмеханизмназад,Сразувстречачитать name последний значение (пара ключ-значение) , а затем используйте 「set name Команда xiaolincoding» записывается в новый AOF документ,Нет необходимости записывать предыдущую первую индивидуальную команду.,потому что Оно принадлежит «историческому» порядку и больше не имеет значения. так что давай, пара индивидуальных ключей значенийсуществоватьпереписатьбревносередина Толькоиспользоватьодинполоска Заказ Сразу ХОРОШОПонятно。
После завершения работы по перезаписи новый файл AOF перезапишет существующий файл AOF, что эквивалентно сжатию файла AOF и уменьшению размера файла AOF.
Каков процесс перезаписи журналов AOF?
Redis изпереписать AOF Процесс состоит из фоновых дочерних процессов. bgrewriteaof завершить из,Это позволит достичь двух преимуществ:
После запуска механизма перезаписи основной процесс создаст дочерний процесс, который перезаписывает AOF. В это время родительский и дочерний процессы совместно используют физическую память. Дочерний процесс перезаписи будет доступен только для чтения. перезаписывает AOF, считывает данные в базе данных, все данные и преобразует пары ключ-значение данных памяти в команду одну за другой, а затем записывает команду в журнал перезаписи (новый файл AOF).
нопереписать процесс,Основной процесс все еще может работать нормально.,В этом проблема,переписать Журнал В процессе АОФ основной процесс изменил существующее существование. ключ-значение, то в это время произойдет копирование при записи. key-value Подпроцесс «Данныесуществовать» из Память данные несовместим с основным процессом «Из Памятьданные». Что нам теперь делать?
Чтобы решить эту проблему несогласованности данных, Redis Настройте AOF переписатьбуфер,этотиндивидуальныйбуферсуществоватьсоздавать bgrewriteaof Дочерний процесс начнет использовать его позже.
существоватьпереписать AOF во время, когда Redis осуществлятьнадодининдивидуальный Писать Заказпосле,этовстречаВ то же время я хотел бы написать индивидуальную команду для фото. 「AOF буферная зона 「AOF переписатьбуфер"。
То есть, да,существовать bgrewriteaof выполнение дочернего процесса AOF Во время перезаписи основной процесс должен выполнить следующие три задачи:
Когда дочерний процесс завершит работу по перезаписи AOF (_сканирует все данные в базе данных, преобразует пары ключ-значение данных памяти в команду одну за другой, а затем записывает команду в журнал перезаписи_), будет выдан сигнал: отправляется основному процессу. Это метод межпроцессного взаимодействия, который является асинхронным.
После того, как основной процесс получит сигнал, он вызовет функцию обработки сигнала, которая в основном выполняет следующую работу:
После выполнения функции сигнала основной процесс может продолжать обрабатывать команды как обычно.
::: tip
Это содержимое журнала AOF. Если вы хотите узнать больше о принципе работы журнала AOF, вы можете подробно прочитать эту статью: Как реализовано сохранение AOF.
:::
Поскольку журнал AOF записывает команды операций, а не фактические данные, при использовании метода AOF для восстановления после сбоя вам необходимо выполнить все журналы. Если журналов AOF слишком много, операция восстановления Redis неизбежно будет медленной.
Чтобы решить эту проблему, Redis добавлен Снимок RDB。Местопредикатиз Снимок,Просто зафиксируйте определенный момент.,Например, когда мы фотографируем пейзаж,В этот момент изображение и информация зафиксировали фото.
Таким образом, снимок RDB записывает данные памяти в определенный момент и записывает фактические данные, в то время как файл AOF записывает журнал командных операций, а не фактические данные.
поэтомусуществовать Redis При восстановлении данных RDB Восстановление данных более эффективно, чем AOF выше, потому что непосредственно RDB Просто прочитайте файл в память, не нужно делать что-то вроде AOF В этом случае для восстановления данных потребуются дополнительные шаги по выполнению команд операции.
Будет ли RDB блокировать потоки при создании снимков?
Redis предоставилдваиндивидуальный Заказ Приходитьгенерировать RDB файлы соответственно save и bgsave,ихизразница Сразусуществовать Вданетсуществовать「хозяиннить」внутриосуществлять:
Redis также может автоматически выполнять команду bgsave через определенные промежутки времени с помощью параметров файла конфигурации. По умолчанию предоставляется следующая конфигурация:
save 900 1
save 300 10
save 60 10000
Не смотрите на название опции сохранение действительно выполняется bgsave команда, то есть будет создан дочерний процесс для генерации Снимок RDBдокумент. Если любое из вышеперечисленных условий соблюдено, оно будет выполнено. bgsave, их значения следующие:
Позвольте мне упомянуть кое-что здесь, Redis из СнимокдаПолный снимок,То есть, да Каждый Второсортныйосуществлять Снимок,Все файлы Память записаны на диск. Так что операция относительно тяжелая,если частота слишком часто,Может повлиять на производительность Redis. если частота слишком низкая,Когда сервер выходит из строя,Потерянных изданных будет больше.
RDB существоватьосуществлять Снимокизкогда,Можно ли изменить данные?
Да, выполнить bgsave В процессе Redis все ещеВы можете продолжить обработку команд операциииз,То есть даданныеда могут быть изменены из,закрыватьключизтехнология Сразусуществовать ВТехнология копирования при записи (COW).
осуществлять bgsave Команда пройдет fork() Создайте дочерний процесс. На данный момент дочерний процесс и родительский процесс используют одну и ту же часть Памятьданныеиз, потому что. что При создании дочернего процесса он будет копировать родительский процесс из таблицы страниц, а таблица страниц но указывает на изфизическую Памятьвсе ещеодинчеловек, на этот раз основная цель операции чтения, затем основная цель bgsave Дочерние процессы не влияют друг на друга.
еслихозяиннитьосуществлятьоперация записи,затем будут изменены изданные, будут копироваться копии,Затем bgsave Дочерний процесс запишет данные копирования в RDB документ,существоватьэтотиндивидуальныйпроцесссередина,Основной нит по-прежнему может напрямую изменять исходные изданные.
::: tip
На данный момент это содержимое снимков RDB. Если вы хотите узнать больше о том, как работают снимки RDB, вы можете подробно прочитать эту статью: Как реализован снимок RDB.
:::
Преимущество RDB в том, что восстановление данных происходит быстро, но частоту создания снимков сложно контролировать. Если частота слишком низкая, будет потеряно больше данных; если частота слишком высока, это повлияет на производительность.
Преимущество AOF в том, что теряется меньше данных, но восстановление данных происходит не быстро.
Чтобы объединить преимущества обоих, Redis 4.0 предлагать Понятносмешиваниеиспользовать Журнал АОФи Память Снимок,Также называется смешанной выносливостью.,Оба гарантированы Понятно Redis Скорость перезапуска и снижение риска потери данных.
смешивание Выносливость Работасуществовать Журнал АОФпереписатьпроцесс,когда включится микширование Выносливость,существовать AOF При переписывании журнала форк Когда дочерний процесс выйдет, он будет первым передан в общий доступ основной общей папке и данным. RDB способ написать AOF документ, и тогда основная команда обработки операции будет записана в буфер существованияпереписать, а буфер перезаписи будет увеличен командой к AOF способ написать AOF файл, после завершения записи уведомите основной процесс о добавлении нового файла, содержащего RDB Формат AOF Отформатированный AOF Файл заменяет старый AOF документ.
Другими словами, используется гибридная персистентность, AOF. документизПервая половина RDB Отформатированный Полныйколичестводанные,назад半частьда AOF Отформатированныйувеличиватьколичестводанные。
такизбенефитссуществовать, перезапустить Redis При загрузке данных, поскольку первая половина RDB содержание,такЗагрузка будет очень быстрой。
Загружено RDB Вторая половина контента будет загружена только после AOF Контент, контент здесь Redis Переписывание фонового дочернего процесса AOF период,Основная обработка рабочей команды,Можеткделатьданные меньше потеряны。
Преимущества гибридной устойчивости:
Недостатки гибридной устойчивости:
Если вы хотите спроектировать высокодоступную службу Redis, вам необходимо рассмотреть возможность использования мультисервисных узлов Redis, таких как репликация главный-подчиненный Redis, дозорный режим и кластеры срезов.
репликация главный-подчиненный
репликация главный-подчиненныйда Redis Самая базовая гарантия высокой доступности услуг. План реализации заключается в использовании первой Redis Сервер, синхронизация данных с несколькими подчиненными устройствами Redis На сервере это модель «один главный-несколько подчиненных», и между главным и подчиненным серверами применяется метод «разделения чтения и записи».
Главный сервер может выполнять операции чтения и записи.,когда автоматически синхронизирует операцию записи с сервером при возникновении операции записи,А с серверов вообще да только чтение,И примите команду операции записи, синхронизированную основным сервером.,Затемосуществлятьэтотполоска Заказ。
То есть, да,всеизданные модификации производятся только на основном существующем сервере,Затем Воляпоследнийданные синхронизируются с от-сервером.,так делает основные данные сервера согласованными.
Уведомление,хозяинотмежду серверамииз Заказкопироватьдаасинхронныйруководитьиз。
Конкретно,существует основной этап распространения команды сервера,После того, как главный сервер получит команду «приехать новое из записи».,будет отправлен на сервер. но,Главный сервер не ждет, пока сервер приезжатьот действительно выполнит команду.,Затем верните результаты клиенту.,А сам основной сервер существует локально после выполнения команды,Просто пойду в клиент и возвращает результат. еслиот сервер еще не изучил основной сервер, синхронизированный из команды,Есть несоответствия между основными серверами.
Следовательно, строгая гарантия согласованности не может быть достигнута (данные «главный-подчиненный» всегда остаются согласованными), и несогласованность данных неизбежна.
::: tip
Хотите узнать больше подробностей Redis репликация принцип работы главный-подчиненный, детализированный синий цвет: репликация главный-подчиненныйдакаквыполнитьиз?
:::
Режим охраны
существоватьиспользовать Redis Когда будет служить хозяин-раб, будет проблема, то есть когда Redis Когда главный и подчиненный серверы не работают, их необходимо восстановить вручную.
Чтобы решить эту проблему, Redis добавлен Режим охраны(Redis Sentinel),потому что Режим охраны готов следить за основным сервером,и предоставитьОсновной отузел аварийного переключения из функции.
::: tip
Хотите узнать больше подробностей Redis Подробнее о принципе работы Sentinel можно прочитать в этой статье: Как реализован Sentinel?
:::
Режим срезового кластера
когда Redis Когда объем кэшированных данных настолько велик, что один сервер не может их кэшировать, вам необходимо использовать Redis кусочеккластер(Redis Cluster ) схема, она распределяет существование на разных серверах, что снижает зависимость системы от одного главного узла и улучшает Redis Производительность службы чтения и записи.
Redis Cluster Решение использует хэш-слот (Hash Slot) для обработки отношений сопоставления между даннымииузел. существовать Redis Cluster плансередина,одининдивидуальныйкусочеккластерделиться 16384 индивидуальныйхеш-слот,Эти хеш-слоты похожи на разделы данных.,Каждыйиндивидуальныйключпара все воспоминания будут основаны на этом Ключ привязан к месту проживания-индивидуальныйхеш-слот. Конкретный процесс изучения разделен на два больших этапа:
Следующий вопрос: как эти хэш-слоты сопоставляются с конкретными узлами Redis? Есть два варианта:
Чтобы облегчить ваше понимание,Объясняю данные, хеш-слот от Картина,Отношение распределения отображения между к и узлом — из.
Кластер срезов на рисунке выше имеет в общей сложности 2 узлы, предполагая, что есть 4 Хэш-слот (Слот 0~Slot 3), мы можем вручную выделить хеш-слоты с помощью таких команд, как node 1 Сохранить хэш-слот 0 и 1. Узел 2 Сохранить хэш-слот 2 и 3。
redis-cli -h 192.168.1.10 –p 6379 cluster addslots 0,1
redis-cli -h 192.168.1.11 –p 6379 cluster addslots 2,3
Затем существованиекластер запускается из процесса, ключ1 и key2 Рассчитано CRC16 После значения указывается общее количество хеш-слотов. 4 Возьмите модуль, а затем сопоставьте его с хеш-слотом в соответствии с результатами соответствующего модуля. 1 (соответствует узлу 1) и хеш-слот 2 (соответствует узлу 2).
нуждаться Уведомлениеизда,существовать Распределение вручнуюхеш-слотчас,нуждаться Пучок 16384 Все слоты были выделены, в противном случае Кластер Redis работает неправильно.
Что такое расщепление мозга?
Давайте сначала разберемся в феномене кластерного расщепления мозга. Это похоже на то, что у человека два мозга, так кто же ими управляет?
Таксуществовать Redis В чем заключается феномен потери данных, вызванный разделением кластера?
существовать Redis В архитектуре «главный-подчиненный» метод развертывания обычно заключается в следующем: «один главный узел и несколько подчиненных устройств». Главный узел обеспечивает операции записи, а подчиненные узлы — операции чтения. если вдруг возникла проблема с хост-узлом, он и все изотузел потеряли связь, но в это время исход-узл-клиент исходит нормально, этот индивидуальный клиент не знает Redis Произошла внутренняя проблема, но я все равно написал этому человеку, который потерял связь. данные (Процесс А), в это время эти данные находятся в буфере у старого владельца узелкэшприезжать, потому Основная проблема отузела заключается в том, что эти данные не удается синхронизировать с отузелизом.
В это время,Часовой также обнаружил, что главный узел потерял связь.,Он думает, что основной блок не работает (но на самом деле основной блок работает нормально),Только у дасеть проблема),Вдадозорный Сразувстречасуществовать「отузел」серединавыбирать Подниматьвнеодининдивидуальный leader В качестве главного узла кластер теперь имеет два главных узла. —— Появляется расщепленный мозг。
Затем,сеть внезапно исцелилась,дозорныйпотому Тот, кто ранее избрал нового владельца узла, понизит старого владельца узла до отузел (А), а затем отузел (А) Пойду вновыйхозяинузелпроситьданныесинхронный,потому что Первая синхронизация находится в режиме полной синхронизации. В это время изотузел (А) очистит свои локальные изданные, а затем выполнит полную синхронизацию. так, процесс предыдущего клиента существует A написанные будут потеряны, а у дакластера возникнет проблема с расщеплением мозга.。
Подводя итог в одном предложении, да: из-за проблемы сети.,Потерян контакт между кластерузелом. Основные отданные рассинхронизированные выборы;,Произведите две отдельные основные услуги. Подождите, пока сеть восстановится.,Уровень узла старого владельца будет понижен до отузел,При синхронизации с новым владельцем узел копироватьиз,Потому что отузел очистит свой буфер,В результате, предыдущий клиент писательизданный был потерян.
решение
когда главный узел обнаруживает, что отузел находится в автономном режиме и таймаут связи наступает, когда общее количество зел меньше порогового значения.,Тогда мастер-узлу запрещено записывать данные,Верните ошибку непосредственно клиенту.
существовать Redis В файле конфигурации мы можем установить два параметра:
мы можем поставить min-slaves-to-write и min-slaves-max-lag Эти два элемента конфигурации используются вместе, и для них установлены определенные пороговые значения соответственно. N и T。
Требование после объединения этих двух элементов конфигурации заключается в том, что подчиненная библиотека, подключенная к главной библиотеке,должна иметь как минимум N индивидуальныйот Библиотека,ихозяин Библиотекаруководитьданныекопироватьчасиз ACK Задержка сообщения не может превышать T секунд, иначе основная библиотека больше не будет получать запросы на запись от клиента.
Даже если исходная основная библиотека ошибочно неисправна,Он также не реагирует на сигналы Sentinel во время ложных сбоев.,Иот библиотека также не может быть синхронизирована,Подтвердить Подтвержденный, естественно, невозможно. требования по совмещению не могут быть удовлетворены путем приезда,Исходная основная библиотека будет ограничена в получении запросов на запись от клиентов.,Клиент больше не сможет получить доступ к новым данным в исходной основной библиотеке.。
Когда откроется новая главная библиотека приезжать,Только новая основная библиотека может получать и обрабатывать запросы клиентов.,в это время,Вновь написанные изданные будут вписаны непосредственно в заселение в новую главную библиотеку. Исходная основная библиотека будет понижена до уровня библиотеки Sentinel.,Даже если оно изданное опустеет,Новые данные не будут потеряны.
Приведем еще один пример.
Предположим, мы установили min-slaves-to-write на 1, min-slaves-max-lag на 12 с и сентри вниз после миллисекунд на 10 с. Основная библиотека по какой-то причине зависает на 15 с, в результате чего Sentinel решил, что Основная база данных была объективно отключена и начала выполнять переключение главный-подчиненный.
В то же время,поскольку исходная основная библиотека застряла 15s,безесть одинот Библиотекаспособныйи Оригиналхозяин Библиотекасуществовать 12s Репликация данных выполняется внутри базы данных, и исходная основная база данных не может принимать запросы клиентов.
Таким образом, после завершения переключения между главным и подчиненным устройствами только новая главная база данных сможет получать запросы, при этом разделения мозга и потери данных не произойдет.
Redis может устанавливать срок действия ключей, поэтому должен быть соответствующий механизм для удаления пар ключ-значение с истекшим сроком действия, и для этого используется стратегия удаления ключа-значения с истекшим сроком действия.
Каждый раз, когда мы против одного человека key Когда срок действия установлен, Redis воля key приноситьначальство Истекшийчасмеждухранилищеприезжатьодининдивидуальныйсловарь с истекшим сроком действия(expires dict), то есть «словарь с истекшим сроком действия» сохраняет все key срок годности.
когданас Запросодининдивидуальный key Когда, Редис Сначала проверьте key данетжитьсуществовать Всловарь с истекшим сроком действиясередина:
Redis использоватьиз Истекшийудалить Стратегияда「Ленивое удаление + обычное удаление」этотдвадобрый Стратегиясоответствоватьииспользовать。
Что такое стратегия ленивого удаления?
Ленивое удаление Стратегияиз Как это сделать,Не удаляйте ключи с истекшим сроком действия активно.,Каждый Второсортныйотданные Библиотекадоступ key время, все обнаружения key Если срок действия истек, удалите его, если срок действия истек. key。
Блок-схема отложенного удаления выглядит следующим образом:
инерцияудалить Стратегияизпреимущество:
инерцияудалить Стратегияизнедостаток:
Что такое политика запланированного удаления?
Как удалить Стратегиюиз регулярно да,Время от времени из библиотеки «случайно» берется определенное количество ключей.
Обычный процесс удаления Redis:
Как видите, обычное удаление — это циклический процесс. Что Redis Чтобы гарантировать, что регулярное удаление не приведет к чрезмерным циклам и не приведет к зависанию, максимальный срок для добавленного процесса периодического цикла удаления не будет превышен по умолчанию. 25ms。
Процесс периодического удаления выглядит следующим образом:
обычныйудалить Стратегияизпреимущество:
обычныйудалить Стратегияизнедостаток:
Можетксмотретьприезжать,Ленивое удаление Стратегии регулярное удаление Стратегия каждая имеет свои собственные изпреимущество,Месток Redis выбирать「Ленивое удаление + обычное удаление」этотдвадобрый Стратегиясоответствоватьииспользовать,кпроситьсуществовать Разумныйиспользовать CPU Найдите баланс между временем и избеганием потерь.
::: tip
Redis с истекшим сроком удаление контента будет упомянуто временно, Хотите узнать больше подробностейиз, подробности вы можете прочитать в этой статье: Redis Истекшийудалить Стратегияи Памятьнеиспользование Стратегия Какая разница?
:::
Постоянство Документ Redis имеет два формата: RDB (Redis Database)и AOF(Append Only File), давайте посмотрим на статус представления просроченного ключа, существующего в этих двух форматах.
RDB Файл разделен на два этапа: Фаза создания документа RDBифаза загрузки。
AOF Файл разделен на два этапа: AOF документписатьэтапи AOF Этап перезаписи.
когда Redis при работе в режиме существования mainот,библиотека не выполняет сканирование по истечении срока действия,библиотека обрабатывает истечение срока действия из пассивного состояния。это да Несмотря на тоот Библиотекасерединаиз key Срок его действия истек. Когда клиент обращается к библиотеке, вы все равно можете приехать. key Соответствующее значение возвращается как пара ключ-значение с неистекшим сроком действия.
обработка ключа с истекшим сроком действия зависит от управления главным сервером,хозяин Библиотекасуществовать key приезжать Ожидатьчас,встречасуществовать AOF Добавить элемент в файл del обратитесь кделать,Синхронизировать приезжатьвсеизот библиотеку,от Библиотекапроходитьосуществлятьэтотполоска del команда для удаления истекшего key。
существовать Redis избегать Памятьдостигатьприезжать Понятноопределенныйиндивидуальныйклапанценить,СразувстречакурокМеханизм устранения памяти,Этот порог — это то, что мы установили для запуска самого большого,этотценитьсуществовать Redis Его можно найти в файле конфигурации, а элемент конфигурации — maxmemory。
Существует восемь типов Стратегии удаления Redis Память. Эти восемь типов Стратегиибольшой делятся на два типа Стратегии: «без удаления данных» и «с удалением данных».
1. Стратегия предотвращения уничтожения данных
noeviction(Redis3.0после,по умолчаниюиз Памятьнеиспользование Стратегия) :это значиткогда Сбить Памятьбольшинствобольшойнастраивать Памятьчас,Не удаляя никакие данные,И да больше не предоставляет услуги,Верните ошибку напрямую.
2. Стратегии удаления данных
По категории «ликвидация данных» ее можно подразделить на два типа Стратегии: «ликвидация в рамках существования» и «ликвидация в рамках существованиявседанные». существования задает срок годности изданных на уничтожение:
Устранение в пределах существованиявседанные:
Что такое алгоритм LRU?
LRU Полное имя Least Recently Used переводитьдлябольшинствозакрыватьбольшинствонемногоиспользовать,Будет решено исключить самые последние использованные изданные.
Традиция LRU алгоритм На основе структуры «связанного списка» элементы в связанном списке располагаются вперед и назад в соответствии с порядком операций. Последняя операция с ключом будет перемещена в начало таблицы, только когда ее необходимо удалить. необходимо удалить элементы из в конце связанного списка, потому что Элемент из в конце связанного списка представляет элемент, который не использовался в течение длительного времени.
Redis Это не реализовано таким образом LRU алгоритм,потому что Традицияиз LRU алгоритмжитьсуществоватьдваиндивидуальныйвопрос:
Как Redis реализует алгоритм LRU?
Redis выполнитьиздаодиндобрыйПримерный алгоритм LRU,Проект издадля лучшего спасения Память,этоизМетод реализации дасуществовать Redis из структуры объекта добавляет отдельное дополнительное поле для записи времени последнего доступа к этим данным.。
когда Redis при выполнении устранения Память,встречаиспользоватьСлучайная выборка для исключения данных,Он случайным образом выбирает 5 индивидуальных значений (это значение можно настроить),ЗатемУстранено в течение длительного временииспользоватьиз этого человека。
Преимущества алгоритма LRU, реализованного Redis:
но LRU алгоритместь одинвопрос,Не удалось решить проблему загрязнения кэша,Например, сумму больших следует читать сразу изданные,И эти данные на этот раз будут только прочитаны,Такэтотнекоторыйданныевстреча Держатьжитьсуществовать Redis кэшируется в течение длительного времени, что приводит к загрязнению кэша.
поэтому,существовать Redis 4.0 Позже представлен LFU алгоритм решения этой проблемы.
Что такое алгоритм LFU?
LFU Полное имя Least Frequently Used переводитьдляРеже всего в последнее времяиспользуетсяиз,Алгоритм LFU исключает обработку данных на основе количества посещений данных.,Это изядерныймысльда“еслиданные в прошлом посещали много раз.,Так Воля Приходитьпосетилизчастотатакжевыше”。
так, LFU алгоритм будет фиксировать количество посещений для каждого индивидуального данныхиз. При повторном посещении когдаиндивидуальныеданные количество посещений данныхиз будет увеличено. так решается проблема, когда данные остаются в кэше в течение длительного времени после того, как к ним время от времени обращаются, сравнению с LRU Алгоритм также более разумен.
Как Redis реализует алгоритм LFU?
LFU алгоритмпо сравнению с LRU Реализация алгоритма записывает больше информации о «частоте доступа к данным». Редис Структура объекта следующая:
typedef struct redisObject {
...
// 24 биты, использовать для записи информации о доступе к объекту
unsigned lru:24;
...
} robj;
Redis в заголовке объекта lru Поле,существовать LRU алгоритм Внизи LFU Методы, используемые в алгоритме, не одинаковы.
существовать LRU в алгоритме,Redis заголовок объекта 24 bits из lru Поля используются для записи key из временной метки доступа, поэтому существует LRU режиме Redis можно настроить в соответствии с заголовке объекта lru Запись поля из значения для сравнения последнего key из Время доступа велико, от и самое долгое время не устраненоиспользоватьиз key。
существовать LFU в алгоритме,Redisзаголовок объекта 24 bits из lru Поле разделено на два сегмента для хранения, высокий 16bit хранилище ldt(Last Decrement время), используемый для записи key из Отметка времени доступа низкая; 8bit хранилище logc(Logistic счетчик), используемый для записи key из Частота посещений.
::: tip
Redis из Память Удаление из Содержимое пока будет упомянуто, Хочу узнать больше подробностейиз, подробности вы можете прочитать в этой статье: Redis Истекшийудалить Стратегияи Памятьнеиспользование Стратегия Какая разница?
:::
Как избежать лавины кэша?
Обычно, чтобы обеспечить согласованность изданныхиданных в кэшизданные в библиотеке, мы даем Redis изданные устанавливают время истечения срока действия, когда срок действия истекает, использовать доступ пользователя изданныеесли не существует В ществоватькэш бизнес-системе необходимо восстановить кэш, чтобы она получила доступ к библиотеке данных и воляданным обновлениям приезжать. Redis , чтобы последующие запросы могли напрямую попасть в кеш.
Так,когдабольшие кэшданныесуществовать Истекло (истекло) одновременночас,еслив это времяиметьбольшойколичествоизиспользоватьсемьяпросить,Ни один из них не может быть обработан в Redis.,Все запросы в да имеют прямой доступ к библиотеке данных.,что привело к внезапному увеличению нагрузки на библиотеку данных из-за,В тяжелых случаях может произойти сбой в работе базы данных.,от и образуют серию цепных реакций,Вызывает сбой всей системы,этот Сразудалавина кэшаизвопрос。
Для проблемы лавины кэша мы можем использовать два решения.
Как избежать выброса кэша?
В нашем бизнесе обычно есть несколько частных лиц, которых часто посещают.,Например, флэш-продажи.,Такие часто посещаемые сайты называются хот-спотами.
есликэшсерединаизопределенныйиндивидуальный Точка доступаданные ИстекшийПонятно,в это времябольшойколичествоизпроситьдоступ Понятно Должен Точка доступаданные,Его нельзя прочитать в открытом виде.,Прямой доступ к библиотеке данных,Библиотека данных легко перегружена большим количеством одновременных запросов.,этот СразудаРазбивка кэшаизвопрос。
Можетк Обнаружить Разбивка тайник — лавина Кэша очень похожа, вы можете думать о кэше как о Разбивке. кэшадалавина кэшаизодининдивидуальныйподмножество。 Чтобы справиться с поломкой кеша, можно использовать два упомянутых ранее решения:
Как избежать проникновения кэша?
когдапроисходитьлавина кэшаили разбивка, данные в библиотеке все Еще к сохраненному приложению необходимо получить доступ к изданным данным, и как только кэш восстановит соответствующие изданные данные, это может уменьшить нагрузку на библиотеку данных и повысить уровень знаний. в кэш это другое.
когдаиспользоватьдоступ пользователяизданные,теперь это Нетсуществоватькэшсередина,также Нетсуществоватьданные Библиотекасередина,Причины существования запроса на доступ к кэшу,Обнаружил, что кэш отсутствует,Когда я снова захожу в библиотеку данных,Было обнаружено, что нет доступа к изданным в библиотеке данным.,Нет возможности построить кэшданные,для обслуживания последующих запросов. Тогда, когда у вас большая сумма, приходит запрос на прибытие,Библиотека данных из-за давления внезапно увеличивается,этот Сразудапроникновение в кэшизвопрос。
Проникновение в кэшиз обычно происходит в следующих двух ситуациях:
Чтобы справиться с планом углубления в кэшиз, существует три распространенных плана.
::: tip
Рекомендуемая литература: Что такое лавина, разрушение и проникновение кэша?
:::
ограничено ограничено,Системе не все нужно хранить,иПросто кэшируйте некоторые данные горячей точки,Итак, мы собираемся спроектировать горячую точку динамического кэширования данных Стратегия.
Точка доступаданныединамичныйкэшиз Стратегия Общая идея:Рейтинг на основе данных о времени последнего посещения,И отфильтровать нечасто посещаемые изданные,Оставить только частые посещения изданные。
К примеру, в сценарии платформы электронной коммерции в настоящее время существует только кэшиспользовать пользователей, часто получающих доступ к топ-1000 продуктов. Конкретные детали заключаются в следующем:
существовать Redis Может использоваться в zadd Метод и zrange Методы выполнения очереди сортировки и получения 200 индивидуальныйтовариздействовать。
Существует 3 типа распространенных обновлений изкэша Стратегия:
В реальной разработке Redis и MySQL из Даженовый Стратегияиспользоватьизда Cache Кроме того, две другие стратегии не могут быть применены.
Стратегия кэширования
Используемая стратегия кэширования,Следует использовать программу напрямую и взаимодействие «данные библиотеки, кэш».,И отвечаю за поддержание кэшиз,Стратегию можно разделить на «Стратегию чтения» и «Стратегию письма».
Шаги для написания Стратегиииз:
Шаги для чтения Стратегияиз:
Уведомление,Порядок шагов по написанию Стратегиииз изменить нельзя.,Прямо сейчасНельзя сначала удалить кэш, а потом обновить базу данных,Причина наличия «чтения + записи» одновременно во времени,Из-за кэшидированных библиотек возникнут изданные несоответствия.
Подниматьиндивидуальныйпример,гипотезаопределенныйиндивидуальныйиспользоватьсемьяизвозрастда 20, запрос A Чтобы обновить возраст пользователя до 21. Так он удалит контент в кэше. В это время еще один индивидуальный запрос B Чтобы прочитать это индивидуальноиспользовать домашнее извлечение, он запрашивает кэш и после обнаружения промаха читает сообщение о прибытии в библиотеку как 20, и записать его в кеш, затем запросить A Продолжайте изменять библиотеку данных, Воляиспользовать домохозяйство по возрасту обновлено до 21。
финальный,Должениспользоватьсемьявозрастсуществоватькэшсерединада 20(старыйценить),существоватьданные Библиотекасерединада 21(новыйценить),кэшиданные Библиотекаизданные Нетодин К。
для Что「Сначала обновите библиотеку данных Сноваудалитькэш」Нетвстречаиметьданные Нетодин Кизвопрос?
Продолжайте использовать «Читать + написать «запрос параллельного сценария для анализа».
еслиопределенныйиндивидуальныйиспользоватьсемьяданныесуществоватькэшсередина Нетжитьсуществовать,просить A При чтении данных возраст запрашивается из базы данных. 20,существоватьеще нетписатькэшсерединачас Другойодининдивидуальныйпросить B Обновить данные. Он обновляет библиотеку данных по мере возраста 21 и очистите кэш. Запрос в это время A Читать отданные в библиотеке как приезжатьизаж 20 изданныеписатьприезжатькэшсередина。
финальный,Должениспользоватьсемьявозрастсуществоватькэшсерединада 20(старыйценить),существоватьданные Библиотекасерединада 21 (новое значение), данные кэшидированной библиотеки противоречивы. отначальстволапшаизтеорияначальствоанализировать,Сначала обновите библиотеку данных,Если вы удалите кэш еще раз, возникнут проблемы с несогласованностью.,Но на самом деле,Вероятность возникновения этой проблемы невелика.。
потому что кэшизписать обычно намного быстрее, чем данные Библиотекаизписать.,Местоксуществоватьдействительныйсерединаочень难вне现просить B База данных обновлена и кэш удален, запросите A Только что закончил обновлять ситуацию. И однажды попросил A раньше, чем просили B Если кэш был обновлен до удаления кэша, то следующий запрос будет, потому что вкэш не удаляется, а отданные перечитываются в библиотеке, поэтому такого несоответствия не произойдет.
Стратегия Cache Aside подходит для сценариев, в которых больше читается и меньше пишется.,Не подходит для написания нескольких сцен.,Когда потому чтокогдаписать чаще,кэш-изданные будут часто чистить,это окажет некоторое влияние на процент попаданий кэшиз. если у бизнеса строгие требования к кэш-рейту,Так Можеткучитыватьдвадобрыйрешение:
Стратегия чтения/записи через
Стратегия чтения/записи в принципе должна использоваться взаимозаменяемо между программами.,Больше не иданные взаимодействия с библиотекой,И да взаимодействует с кэшидированной библиотекой,В соответствии с обновленной библиотекой данных, сам кэш был проксирован.
1. Прочтите стратегию
Первый Запроскэшсерединаданныеданетжитьсуществовать,еслисуществовать вернётся напрямую,если Нетжитьсуществовать,Компонент кэша отвечает за запрос данных библиотеки.,И результаты Воля пишутприезжатькэш компоненты,большинствоназадкэшкомпоненты Воляданные Вернуться к следует использовать。
2、Написать через Стратегия
когдаиметьданные Даженовыйизкогда,Первый Запросхотетьписатьизданныесуществоватькэшсерединаданетужежитьсуществовать:
Ниже Read Through/Write Through Стратегияиз Принципиальная схема:
Read Through/Write Through Стратегияиз Возможности, которые можно использовать кэшузел вместо использования программы для работы с иданными библиотеками, существуют по сравнению с нашим процессом разработки. Cache Aside Стратегия менее распространена, поэтому мы часто используем компоненты распределенного кэша, независимо от того, да Memcached все еще Redis Ни один из них не предоставляет написанные библиотеки, автоматическую загрузку библиотеки данных и функции зданных. И когда мы будем существоватьиспользовать локальный кэшиз, можно будет рассмотреть возможность использования такой стратегии.
Стратегия обратной записи
Стратегия обратной записисуществовать Даженовыйданныеизкогда,Только обновлять кэш,такой жечас Волякэшданныеустановлен нагрязныйиз,Тогда немедленно возвращайтесь,Библиотека данных не будет обновляться. потерянные библиотеки из обновления,Это будет сделано посредством пакетных асинхронных обновлений.
Собственно, Стратегия обратной записи также нельзя использоватьиспользуйтеприезжать Мы часто используемизданные библиотеки икэшиз сцены, потому что что Redis В функции асинхронного обновления библиотеки данных нет.
Write Back да Проектирование архитектуры компьютера, например CPU изкэш, документ операционной системы, системные изкэш все принятыиспользовать Стратегия обратной записи。
Стратегия обратной записи особенно подходит для написания нескольких сцен.,потому что Когда происходит операция записи,Просто нужно обновить кэш,Он немедленно вернулся. например,При написании документиз,Фактически, даписатьприездокументировать система изкэш вернулась,На диск не пишет.
но приносит из проблемда,данные не отличаются строгой согласованностью,И есть риск потери данных,потому кекэш обычно используется с Память, а Памятьда не является Выносливостьюиз, поэтому, как только кэш-машина потеряет мощность, исходный кэш с грязными данными будет потерян. Таким образом, вы обнаружите, что после выключения системы некоторые предыдущие данные будут потеряны. что Page Cache Нет времени прошивать диск и вызывать из.
Разместите один здесь CPU кэши Памятьиспользовать Write Back Стратегияизпоток Ченг Ту:
Вам кажется, что этот индивидуальный процесс выглядит знакомо? потому что я упомянул о существовании места проживания, когда писал статью о кэше процессора.
::: tip
Рекомендуемая литература: Как библиотека данных обеспечивает согласованность?
:::
Очередь задержки означает размещение дел раньше и отсрочку их на некоторое время позже. Общие сценарии очереди с задержкой включают следующее:
существовать Redis Доступно киспользоватьиметьнабор последовательностей(ZSet)из Способ Приходитьвыполнить Задерживатьинформацияочередьиз,ZSet есть один Score свойство Доступно киспользовать Приходитьхранилище Задерживатьосуществлятьизчасмежду。
использовать zadd score1 value1 Команда всегда может создавать сообщения в памяти. повторное использование zrangebysocre Запросить ожидающие задачи, соответствующие условиям извсе, Просто циклически перемещайтесь по задаче «Изучить очередь».
Что такое ключ Redis?
большой key не означает key изценитьоченьбольшой,ида key Переписка value оченьбольшой。
Вообще говоря, следующие две ситуации называются большими ключами:
большой key Какие проблемы это вызовет?
большой key Это приведет к следующим четырем последствиям:
как найтиприезжатьбольшой key ?
1、redis-cli --bigkeys Находитьбольшойkey
может пройти redis-cli --bigkeys Команда найти большой key:
redis-cli -h 127.0.0.1 -p6379 -a "password" -- bigkeys
использоватьизкогда Уведомлениеиметь значение:
Недостатки этого метода:
2、использовать SCAN Команда найти большой key
использовать SCAN команду для сканирования базы данных, а затем используйте TYPE Команда получения прибыли от каждого человека key из типа.
для String Тип, можно использовать напрямую STRLEN Команда получает длину строки из, то есть количество байтов пространства, занимаемого да.
для типа коллекции,Есть два способа получить его:
LLEN
Команда Хэш; тип:HLEN
Команда Установить; тип:SCARD
Команда отсортирована; Set тип:ZCARD
Заказ;MEMORY USAGE
команда (требуется Redis 4.0 икначальство Версия),Запросодининдивидуальныйключпара значенийзаниматьиспользоватьиз Памятькосмос。3、использовать RdbTools Инструменты для поиска больших key
использовать RdbTools Для анализа можно использовать сторонние инструменты с открытым исходным кодом. Redis Снимок(RDB)документ,попытаться найтиприезжать Чтосерединаизбольшой key。
например,Следующая команда,Волябольшой В 10 kb из key 输внеприезжатьодининдивидуальныйлистдокумент.
rdb dump.rdb -c memory --bytes 10240 -f redis.csv
Как удалить большую key?
Суть операции удаления заключается в освобождении пары ключей, занимающих пространство Использовать Память, не стоит недооценивать процесс освобождения Памятьиз.
Выпустить Память только для первого шага,Чтобы эффективнее управлять пространством Память,существоватьотвечатьиспользоватьпрограммавыпускать Памятьчас,Операционной системе необходимо вставить освобожденный блок из Память в отдельный свободный блок Память из связанного списка.,к Последующее управление и перераспределение. Этот индивидуальный процесс сам по себе занимает некоторое время,И заблокирует Памятьиз, следует использовать программу перед выпуском когда.
так,еслиодин Внизребеноквыпускать Понятнобольшойколичество Память,Время работы блок-листа «Память» в режиме ожидания увеличится,Взаимноотвечатьземля Сразувстречапричина Redis Основной нитиз заблокирован. Когда основной нитиз заблокирован, другие все запросы могут привести к тайм-ауту. Redis Соединение исчерпано, и создаются различные исключения.
поэтому,удалитьбольшой key Нам следует быть осторожными с этим шагом. Как это сделать конкретно? Вот два метода:
1. Удалить пакетно
дляудалитьбольшой Hash,использовать hscan
команда, получить каждый 100 поле, затем используйте hdel
команда, удалять каждый раз 1 поля.
Код Python:
def del_large_hash():
r = redis.StrictRedis(host='redis-host1', port=6379)
large_hash_key ="xxx" #Чтобы удалить имя ключа изbighash
cursor = '0'
while cursor != 0:
# использовать hscan команда,получить каждый 100 индивидуальный Поле cursor, data = r.hscan(large_hash_key, cursor=cursor,count=100)
for item in data.items():
# Сноваиспользовать hdel команда, удалять каждый раз1индивидуальныйполе
r.hdel(large_hash_key, item[0])
дляудалитьбольшой List,проходить ltrim
команда, удалять каждый разнебольшое количество элементов.
Код Python:
def del_large_list():
r = redis.StrictRedis(host='redis-host1', port=6379)
large_list_key = 'xxx' #Чтобы удалить имя ключа из большого списка
while r.llen(large_list_key)>0:
#Каждый раз удаляем только 100 крайних правых отдельных элементов
r.ltrim(large_list_key, 0, -101)
дляудалитьбольшой Set,использовать sscan
команда, каждый раз при сканировании коллекции 100 элементы, затем используйте srem
Команда удаляет по одному ключу за раз.
Код Python:
def del_large_set():
r = redis.StrictRedis(host='redis-host1', port=6379)
large_set_key = 'xxx' # Чтобы удалить имя ключа избольшойсетиз
cursor = '0'
while cursor != 0:
# использовать sscan команда,каждый раз при сканировании коллекции 100 индивидуальныйэлемент cursor, data = r.sscan(large_set_key, cursor=cursor, count=100)
for item in data:
# Сноваиспользовать srem Команда для удаления одного индивидуального ключа за раз
r.srem(large_size_key, item)
дляудалитьбольшой ZSet,использовать zremrangebyrank
команда, удалять каждый раз top 100 элементов.
Код Python:
def del_large_sortedset():
r = redis.StrictRedis(host='large_sortedset_key', port=6379)
large_sortedset_key='xxx'
while r.zcard(large_sortedset_key)>0:
# использовать zremrangebyrank команда, удалять каждый раз top 100 индивидуальных элементов
r.zremrangebyrank(large_sortedset_key,0,99)
2. Асинхронное удаление
из запуска версии Redis 4.0,Можетк Выбиратьиспользоватьасинхронное удалениеЗакон,использовать unlink замена команды del удалить。
Таким образом, Redis поместит ключ в асинхронный поток для удаления, чтобы не блокировать основной поток.
Помимо активных звонков unlink Помимо команды достижения асинхронного удаления, мы также можем Пройти параметры конфигурации, автоматически выполнить асинхронныйудалить при выполнении определенных условий.
В общей сложности включены 4 сценария, все из которых по умолчанию отключены:
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del
noslave-lazy-flush no
Они обозначают из и имеют следующие значения:
Рекомендуется включить lazyfree-lazy-eviction, lazyfree-lazy-expire, lazyfree-lazy-server-del и другие конфигурации, которые могут эффективно повысить основную эффективность.
Конвейерная технология (Pipeline) — клиент предоставляет технологию пакетной обработки,Обработка нескольких отдельных команд Redis одновременно,и улучшить общую производительность индивидуального интерактивного взаимодействия.
Обычный командный режим, как показано на рисунке ниже:
Конвейерный режим, как показано на рисунке ниже:
использоватьСантехнические технологии позволяют решить несколько индивидуальных заказов интересно изсеть подождать,Он объединяет несколько команд и отправляет их на сервер для обработки, а затем возвращает клиенту.,так исключается необходимость ждать ситуации после каждой команды изучать,от и эффективно повышать эффективность программы изосуществования.
ноиспользовать管道технологиятакжехотеть Уведомлениеизбегатьотправлятьиз Заказ Проходитьбольшой,или В трубе слишком много изданных материалов, что приводит к их блокировке.
хотеть Уведомлениеизда,Конвейерная технология по сути обеспечивает клиентскую функциональность.,и Нет Redis Серверная функциональность.
MySQL существоватьосуществлятьделачас,Будет предусмотрен механизм отката,когдаделаосуществлять При возникновении ошибки,Все операции в делаизвсе будут отменены.,Измененные изданные также будут восстановлены в предыдущее состояние.
Redis не предоставляет механизм отката.,Хотя Redis предоставил DISCARD Заказ,ноэтотиндивидуальный Заказ Толькоспособныйиспользовать Приходитьхозяинсдатьсяделаосуществлять,Очистить временную очередь команд,Эффекта отката проезда нет.
Ниже DISCARD Использование команды:
#читать count изценить4
127.0.0.1:6379> GET count
"1"
#Опендела
127.0.0.1:6379> MULTI
OK
#Отправь делаиз первой индивидуальной операции и уменьши счет на 1
127.0.0.1:6379> DECR count
QUEUED
#осуществлять команда DISCARD, добровольно отказаться от дел
127.0.0.1:6379> DISCARD
OK
#Прочитайте значение a:stockiz еще раз, значение не было изменено
127.0.0.1:6379> GET count
"1"
В процессе делаосуществлять не было сообщено об ошибке, когда команда if была добавлена в очередь, но после того, как дела были отправлены, фактически было сообщено об ошибке. Правильную команду все еще можно использовать в обычном режиме. Redis не обязательно гарантирует атомарность.(атомарность:деласерединаиз Заказхотеть Нет Полный部успех,Иначе все провалится).
Например, следующий пример:
#Получаем исходное значение имени
127.0.0.1:6379> GET name
"xiaolin"
#Опендела
127.0.0.1:6379> MULTI
OK
#Установим новое значение
127.0.0.1:6379(TX)> SET name xialincoding
QUEUED
#Обратите внимание, эта команда неверна
# expire Срок годности правильно представляет собой число, а не строку из десятков, но все еще Успешно присоединился к команде
127.0.0.1:6379(TX)> EXPIRE name 10 с
В ОЧЕРЕДИ
# полный фильм дела,Сообщить об ошибке
#смотретьсмотретьзаходите в гости set осуществлятьуспех,и expire осуществлятьошибка。
127.0.0.1:6379(TX)> EXEC
1) OK
2) (error) ERR value is not an integer or out of range
#Можетксмотретьприезжать,name все ещеодеялоустановлен новое значение
127.0.0.1:6379> GET name
"xialincoding"
Почему Redis не поддерживает откат транзакций?
Официальная документация Redis объясняет это следующим образом:
большой общий смысл да, автор не поддерживает откат дела из-за следующих двух причин:
Откат дела здесь не поддерживается, что означает, что изда не поддерживает ошибку времени выполнения отката дела.
Распределенная блокировкадаиспользовать ВРаспределенная среда Внизи发контрольизодиндобрыймеханизм,использовать Вконтрольопределенныйиндивидуальныйресурссуществоватьтакой жеодинчасвырезать Толькоспособныйодеялоодининдивидуальныйотвечатьиспользовать Местоиспользовать。Как показано ниже:
Сам Redis может использоваться совместно и доступен нескольким клиентам.,Просто индивидуальная общая система хранения.,Доступно киспользовать Приходить Сохранятьжить Распределенная блокировка,Более того, Redis имеет высокую производительность чтения и записи.,Он может справиться со сценариями высокого параллелизма и блокировки операций.
Redis из SET Есть команда Параметр NX может реализовать «вставить ключ, только если он не существует»,Месток Доступно киспользоватьэто Приходитьвыполнить Распределенная блокировка:
на основе Redis узелвыполнить Распределенная блокировкачас,для операции блокировки,Нам необходимо выполнить три индивидуальных условия.
Распределенная команда, удовлетворяющая этим трем индивидуальным условиям, выглядит следующим образом:
SET lock_key unique_value NX PX 10000
Процесс разблокировки прост как да Воля lock_key ключ удаления (del lock_key), но не может удалить его случайным образом и гарантирует, что клиент заблокирован при работе с клиентом. так, при разблокировке надо сначала определить блокировку unique_value да это не заблокированный клиент, даиз, значит Воля lock_key ключ для удаления.
Как видите, для разблокировки необходимо две операции. Lua Скрипт, гарантирующий разблокировку изамарности, потому что что Redis существоватьосуществлять Lua Скрипт можно использовать в режиме изучения ккатомарности, что гарантирует изамарность операции открытия замка.
// При отпускании блокировки сначала сравните unique_value Равно ли да, чтобы избежать случайного снятия блокировки
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
Как только так наступит, passuse SET команда и Lua Скриптсуществовать Redis одинузелначальствонадстановиться Понятно Распределенная блокировкаиз Замоки Разблокировать。
на основе Redis Каковы преимущества и недостатки реализации распределенных блокировок?
на основе Redis выполнить Распределенная блокировкаизпреимущество:
на основе Redis выполнить Распределенная блокировкаизнедостаток:
Redis Как решитькластер Состояние Вниз Распределенная блокировкаиз Может Надежность?
для Понятно Сохранять证кластерсреда Вниз Распределенная блокировкаиз Может Надежность,Redis Чиновник разработал алгоритм распределенной блокировки Редлок.
это дана основемногоиндивидуальный Redis узелиз Распределенная блокировка,Даже если что-то сломается,Переменная блокировки остается на месте,клиентсемьяконецвсе еще может завершить операцию блокировки. Официальная рекомендация — развернуть как минимум да 5 индивидуальный Redis узел,И они все дахозяинузел,Между ними нет никаких отношений,Вседаодининдивидуальныйиндивидуальныйизолированныйизузел。
Redlock алгоритмиз Основные идеи,да Пусть клиент и несколько отдельных пользователей, независимых от узла Redis, по очереди запросят заявку на блокировку,если клиент может успешно завершить операцию блокировки на половине компьютеров,Такнас Сразураспознаватьдля,Клиент успешно получил распределенную блокировку,В противном случае блокировка не удастся。
так Приходите, даже если есть некий индивидуум Redis узел неисправен, потому что Замокизданныесуществоватьдругойузелначальствотакжеиметь Сохранятьжить,Все клиенты по-прежнему могут нормально выполнять операции блокировки.,Замок изданный тоже не потеряется.
Redlock алгоритм Замоктрииндивидуальныйпроцесс:
Можетксмотретьприезжать,Замокуспеххотетьтакой жечасудовлетворитьдваиндивидуальныйсостояние(Краткое описание: если имеет более половины из Redis узелуспехизполучатьприезжать Понятно Замок,И общий расход времени не превышает блокировки эффективного времени.,Так Сразуда Замокуспех):
После успешной блокировки,Клиенту необходимо пересчитать время действия этой блокировки,Результатом расчета является «начальное время установки и истечения срока действия блокировки» минус «общее время, затраченное большинством клиентов на получение блокировки (t2-t1)». если результат расчета слишком запоздал для завершения операции обмена данными,Мы можем снять замок,чтобы не создалось впечатление, что операция с данными еще не завершена,Срок действия блокировки истек.
После неудачной блокировки,клиентсемьяконец向все узел Redis инициирует снятие блокировки с операции,Операция снятия блокировки аналогична операции снятия блокировки на отдельном узле.,Толькохотетьосуществлятьвыпускать Замокиз Lua Скрипт сделает свое дело.
Ссылки: