Галерея диаграмм связей Обучение структуре знаний Redis
Поскольку существует множество типов данных Redis, а разные типы данных имеют одни и те же метаданные для записи, Redis будет использовать структуру RedisObject для единообразной записи этих метаданных. При сохранении типа Long указатель RedisObject напрямую присваивается целому числу.
Отредактировано в 2022-11-14 13:53:00A segunda unidade do Curso Obrigatório de Biologia resumiu e organizou os pontos de conhecimento, abrangendo todos os conteúdos básicos, o que é muito conveniente para todos aprenderem. Adequado para revisão e visualização de exames para melhorar a eficiência do aprendizado. Apresse-se e colete-o para aprender juntos!
Este é um mapa mental sobre Extração e corrosão de mim. O conteúdo principal inclui: Corrosão de metais, Extração de metais e a série de reatividade.
Este é um mapa mental sobre Reatividade de metais. O conteúdo principal inclui: Reações de deslocamento de metais, A série de reatividade de metais.
A segunda unidade do Curso Obrigatório de Biologia resumiu e organizou os pontos de conhecimento, abrangendo todos os conteúdos básicos, o que é muito conveniente para todos aprenderem. Adequado para revisão e visualização de exames para melhorar a eficiência do aprendizado. Apresse-se e colete-o para aprender juntos!
Este é um mapa mental sobre Extração e corrosão de mim. O conteúdo principal inclui: Corrosão de metais, Extração de metais e a série de reatividade.
Este é um mapa mental sobre Reatividade de metais. O conteúdo principal inclui: Reações de deslocamento de metais, A série de reatividade de metais.
Обучение структуре знаний Redis
Проблема с согласованностью кэша
Сначала обновите базу данных, затем удалите кеш
(1) Срок действия кэша только что истек. (2) Запрос A на запрос к базе данных и получение старого значения. (3) Запрос B на запись нового значения в базу данных. (4) Запрос B на удаление кэша (5) Запрос A на запись найденного старого значения в кеш.
Вышеупомянутое приведет к грязным данным
Но только если 3 среди 2 и 3 быстрее 2, B первым удалит кеш, а A запишет в кеш старое значение.
На самом деле запись в базу данных происходит намного медленнее, чем чтение, поэтому избегайте медленного SQL.
Сначала удалите кеш, а затем запишите в базу данных
(1) Сначала удалите кеш (2) Снова запишите базу данных (эти два шага такие же, как и раньше) (3) Спите на 1 секунду и снова удалите кеш.
Использовать асинхронное двойное удаление
Основные операции
Общие операции
Проверьте количество и длину
Существует ли он, содержит ли он, добавляет, увеличивает или уменьшает ключ или определенное поле под ключом
Удалить, удалить указанное местоположение, удалить и получить
бесплатная тема
тип данных
Ключ
Удалить, создать, просмотреть, сопоставить по шаблону (большие коллекции будут иметь проблемы с производительностью),
Сканирование повторяет все ключи,
Сортировать список, установить
Миграция с одного экземпляра Redis на другой экземпляр Redis
Установите, отмените время истечения срока действия и получите оставшееся время истечения ключа.
Как Redis удаляет ключи с истекшим сроком действия Существует два способа истечения срока действия ключей Redis: пассивный и активный. Когда некоторые клиенты попытаются получить к нему доступ, ключ будет обнаружен, и срок его действия истек. Конечно, этого недостаточно, поскольку к некоторым ключам с истекшим сроком действия доступ будет никогда невозможен. Срок действия этих ключей в любом случае должен истечь, поэтому время истечения срока действия ключей устанавливается случайным тестом по времени. Все эти ключи с истекшим сроком действия будут удалены из пространства ключей. В частности, это то, что Redis делает 10 раз в секунду: Проверьте 20 случайных ключей на предмет определения срока действия. Удалите все ключи с истекшим сроком действия. Если срок действия более 25% ключей истек, повторите шаг 1. Это тривиальный вероятностный алгоритм. Основное предположение состоит в том, что наша выборка является элементом управления ключом, и мы продолжаем повторять обнаружение срока действия до тех пор, пока процент ключей с истекшим сроком действия не станет меньше 25%, что означает, что в любой момент времени В определенный момент времени. большая часть ключей с истекшим сроком действия будет удалена.
Набор
Sdiff получает элементы, которых нет в наборе. SDiff a b эквивалентен a-b.
Sdiff Store сохраняет разницу, установленную в ключе.
Найдите объединение нескольких множеств, которое можно хранить в ключе
SInter занимает пересечение. SInterStore записывает пересечение в ключ.
Список
Операция BLOCK, блокирующая значение в начале и конце очереди.
Вы можете указать получение значений из нескольких очередей
Когда очередь пуста, клиент будет заблокирован до тех пор, пока не произойдет запись. Вы можете указать таймаут и вернуть ноль после таймаута.
Блокирующие операции обеспечивают справедливость
Redis 2.4 и 2.6 отличаются. При одновременной записи нескольких значений, например a, b, c, клиент, ключ которого заблокирован, получит a в 2.4 и c в 2.6.
Если после удаления значения с сервера клиент зависнет до того, как значение будет обработано, значение будет потеряно. Механизм подтверждения сообщения RabbitMQ может решить эту проблему.
Вы можете использовать операцию блокировки List в сочетании с атомарными операциями других типов данных в одной транзакции, чтобы обеспечить поведение блокировки для клиента.
Можно ли добиться справедливо распределенных блокировок?
Подобно операциям, предоставляемым List в Java, LTrim добавляется для перехвата значений в определенном диапазоне.
Удалить последний элемент из списка и поместить его в другой список
бесплатная тема
заказанная коллекция
Вы можете выполнять операции сокращения объединения нескольких упорядоченных наборов, поддерживая SUM, MIN и MAX.
Возвращает рейтинг ключа в упорядоченном наборе
Вы можете получить определенный диапазон значений в упорядоченном наборе, а также указать минимальные и максимальные баллы для запроса набора в этом диапазоне на страницах.
Перебирать коллекцию
Сделка
смотреть
Команда WATCH может отслеживать один или несколько ключей. После изменения (или удаления) одного из ключей последующие транзакции не будут выполняться. Мониторинг продолжается до тех пор, пока значение не будет изменено до выполнения exec, транзакция не будет выполнена. Это эквивалентно проверке Redis во время exec.
Поскольку функция команды WATCH заключается только в предотвращении выполнения последующей транзакции при изменении отслеживаемого значения ключа, она не может гарантировать, что другие клиенты не изменят значение ключа. Поэтому, как правило, нам необходимо повторно выполнить команду. Выполнение EXEC после сбоя всей функции. Гарантировано с петлей
После выполнения команды EXEC мониторинг всех ключей будет отменен. Если вы не хотите выполнять команды в транзакции, вы также можете использовать команду UNWATCH для отмены мониторинга. В некоторых бизнес-сценариях после просмотра мы не обязательно можем выполнять транзакционные операции.
Команда Watch — это технология оптимистической блокировки. Пока значение этого ключа изменено, последующие допустимые изменения не вступят в силу. Этот метод обычно можно использовать для уменьшения условий гонки. Когда exec возвращает пустую коллекцию, операция считается неудачной.
Exec фактически выполняет все инструкции в транзакции и очищает команду наблюдения.
Ответ команды Exec представляет собой массив, соответствующий порядку выполнения команды.
Даже если одна/некоторые команды в транзакции не будут выполнены, другие команды в очереди транзакций всё равно продолжат выполняться — Redis не прекратит выполнение команд в транзакции.
Прежде чем транзакция выполнит EXEC, в командах, поставленных в очередь, могут возникнуть ошибки. Например, команда может выдать синтаксические ошибки (неправильное количество параметров, неправильные названия параметров и т. д. В этом случае клиент прекратит выполнение транзакции.
Все команды, выполненные с начала команды Mutil до команды exec, будут введены в очередь транзакций.
Хэш
Существует ли он, добавьте, удалите, получите все ключи, значения, повторите сбор хэшей.
Увеличьте хеш-значение ключа. Если ключ не существует, установите для него значение увеличения 0.
бесплатная тема
Подводные камни структуры данных
Когда размер строки необходимо увеличить, если он меньше 1 М, он будет удвоен. Если он больше 1 М, каждый раз он будет увеличиваться только на 1 М. Максимальная длина — 512 М.
Если значение самоприращения превышает максимальное значение, будет сообщено об ошибке.
Для структур данных типа контейнера: если контейнер не существует, создайте его, если элемент больше не существует, удалите контейнер;
Распределенная блокировка
Решение с одним узлом (без красного замка)
Получить блокировку
хеш для узла кластера
Если он не существует, установите путь блокировки. Установите срок действия.
Блокировка — это установка значения идентификатора клиента.
Настройте сторожевой таймер и регулярно обновляйте блокировку. Это можно реализовать с помощью очереди с задержкой.
Если блокировка не получена, рассмотрите возможность блокировки и ожидания получения.
Разблокировать
Если время истечения срока действия не установлено, это приведет к возникновению проблемы взаимоблокировки.
а) Как только в Redis произойдет переключение между главным и подчиненным устройствами, некоторые блокировки могут быть потеряны.
Сравнить с ЗК
Распределенная блокировка, реализованная Zookeeper, на самом деле имеет недостаток: производительность может быть не такой высокой, как у службы кэширования. Потому что каждый раз в процессе создания и снятия блокировки временные узлы должны динамически создаваться и уничтожаться для реализации функции блокировки. Создание и удаление узлов в ZK может осуществляться только через сервер Leader, и тогда данные не передаются всем машинам Follower. Проблемы параллелизма могут включать в себя дрожание сети и разрыв сеансового соединения между клиентом и кластером ZK. Кластер ZK считает, что клиент не работает, и удалит временный узел. В это время другие клиенты могут получить распределенную блокировку.
Redis сложно добиться справедливости
Редлок
В распределенной версии алгоритма мы предполагаем, что у нас есть N хостов Redis. Узлы полностью независимы, поэтому мы не используем репликацию или любую другую неявную систему координации. Мы описали, как безопасно получать и снимать блокировки в одном экземпляре. Мы считаем само собой разумеющимся, что алгоритм будет использовать этот метод для установки и снятия блокировок в одном экземпляре. В нашем примере мы установили N = 5, что является разумным значением, поэтому нам нужно запустить 5 главных серверов Redis на разных компьютерах или виртуальных машинах, чтобы гарантировать, что они выходят из строя практически независимо. Для получения блокировки клиент выполняет следующие операции: 1. Получает текущее время в миллисекундах. 2. Он пытается получить блокировку во всех N экземплярах по порядку, используя одно и то же имя ключа и случайное значение во всех экземплярах. На этапе 2, когда блокировка устанавливается в каждом экземпляре, клиент использует небольшой тайм-аут по сравнению с общим временем автоматического снятия блокировки для ее получения. Например, если время автоматического отпускания составляет 10 секунд, время ожидания может находиться в диапазоне ~5–50 мс. Это предотвращает блокировку клиентов в течение длительного периода времени, когда они пытаются и не могут связаться с узлом Redis: если экземпляр недоступен, мы должны попытаться связаться со следующим экземпляром как можно быстрее. 3. Клиент вычисляет время, необходимое для получения блокировки, вычитая временную метку, полученную на шаге 1, из текущего времени. Блокировка считается полученной тогда и только тогда, когда клиент может получить блокировку в большинстве случаев (не менее 3) и общее время, затраченное на получение блокировки, меньше времени действия блокировки. 4. Если блокировка получена, ее временем действия считается начальное время действия минус истекшее время, рассчитанное на шаге 3. 5. Если клиенту по какой-либо причине не удается получить блокировку (невозможно заблокировать N/2 1 экземпляров или отрицательное время действия), он попытается разблокировать все экземпляры (даже если он думает, что не может заблокировать).
Когда узел зависает, риск вытеснения блокировки отсутствует.
кэш
Неверный
Установите случайное значение времени отказа, чтобы избежать коллективного отказа.
Реализация структуры данных
Сценарии применения
zset
Запишите список идентификаторов сообщений пользователей. Быстрый просмотр.
Записать список идентификаторов сообщений в горячий список. Общий горячий список, горячий список категорий.
Используется для записи один-ко-многим, а партия со многими не может быть строго повторена.
Запишите определенную коллекцию, которая может быть связана с пользователем или всей системой.
хэш
Записывайте количество лайков, комментариев и кликов на публикацию.
Запишите название публикации, аннотацию, автора, информацию на обложке и т. д.
Кэшируйте содержимое последних горячих сообщений (содержимое сообщения очень велико и не подходит для извлечения из базы данных).
список
Запишите список связанных статей поста. Порекомендуйте похожие посты на основе содержания.
битовая карта
Используется как массив bool или собственный битовый массив, в основном для экономии памяти.
Гиперлоглог
Используется для грубого расчета статистических значений после дедупликации.
Например, UV веб-сайта должен фильтровать повторные посещения.
Вы можете только сложить и получить общее число, но не можете узнать, существует ли определенное значение или все элементы.
фильтр Блума
Используется для удаления дубликатов. Узнайте, существует ли элемент в списке.
Если оно существует, оно не обязательно существует на самом деле Если его нет, то его точно не существует
Рассмотрите возможность рекомендации пользователям непосещенных ресурсов.
Подумайте о том, чтобы не использовать ресурсы несколько раз.
Должен быть допущен определенный уровень отказов, то есть доступ к ресурсу может быть невозможен, но считается, что к нему был осуществлен доступ.
Используйте несколько алгоритмов хеширования и установите биты сопоставления ключей на 1.
Если его нет, то его точно не существует!!!!
Есть только команды добавления и существования (можно отметить несколько)
Вы можете использовать начальные параметры для установки фильтра. error_rate — это частота ошибок. Чем ниже значение, тем больше пропускная способность. Initial_size — это предполагаемая общая сумма. Общая сумма должна быть установлена в соответствии с реальным сценарием.
Redis-cell
Если проект невелик и стоимость обслуживания невелика, вы можете использовать redsi-cell напрямую. В противном случае вы можете рассмотреть возможность детального контроля каждого узла обслуживания, чтобы ограничить поток, и реализовать его с помощью соответствующей стратегии балансировки нагрузки.
Используйте zset и Score, чтобы обвести временное окно и подсчитать, сколько раз одно и то же поведение происходит для одного и того же пользователя в пределах временного окна. Если количество текущих ограничений слишком велико, оно может быть неприменимо, например 1000 раз в секунду. .
Тест КЛ.ДРОССЕЛЬ 100 400 60 3
проверка емкости ключа 100 (максимальный параллелизм) до 400 раз в течение 60 секунд. На этот раз применяются 3 емкости.
1: успешно ли, 0: успешно, 1: отклонить 2: Емкость корзины токенов, размер — начальное значение 1. 3: Токены, доступные в текущем сегменте токенов. 4: Если запрос отклонен, это значение указывает, сколько времени пройдет, прежде чем токен будет повторно добавлен в сегмент воронки. Единица измерения: секунды, которые можно использовать в качестве времени повтора. 5: Указывает, сколько времени потребуется, чтобы токены в корзине токенов были заполнены.
алгоритм воронки
специальные структуры данных
Сжатый связанный список
Он состоит из сжатых связанных списков или массивов, чтобы избежать дополнительных затрат памяти по сравнению с обычными связанными списками.
Двусвязный список, созданный для максимальной экономии памяти.
Хранить строку или целое число
Экономьте память в деталях, используя кодировку переменной длины для хранения значений.
Каждый элемент будет иметь отдельное количество цифр для обозначения длины данных и типа элемента.
Реализация базовых структур данных хеша, списка и zset.
Функции
1) Внутреннее представление — это непрерывный массив памяти, в котором данные компактно расположены.
2) Вы можете моделировать структуру двусвязного списка, вводить и удалять из очереди со временной сложностью O (1).
3) Новая операция удаления предполагает перераспределение или освобождение памяти, что увеличивает сложность операции.
4) Операции чтения и записи включают в себя сложные перемещения указателя, а временная сложность в худшем случае равна O(n2).
5) Подходит для хранения небольших объектов и данных ограниченной длины.
1) При использовании ziplist для сценариев с высокими требованиями к производительности рекомендуется длина не должна превышать 1000, а размер каждого элемента контролировать в пределах 512 байт.
стол для прыжков
Список пропуска поддерживает поиск по среднему значению O(logN) и поиск по сложности O(N) в худшем случае.
Почему бы не использовать деревья или сбалансированные деревья вместо таблиц прыжков?
Реализация таблицы переходов очень проста и может достигать уровня O(logN).
быстросвязный список
Сжатый связанный список связывается с помощью указателей и становится связанным списком.
Значение по умолчанию для каждого ziplist — 8 КБ (настраиваемое).
Эксплуатация и обслуживание
монитор
2) Используйте команду info Commandstats, чтобы получить среднее время выполнения команды, включая количество вызовов каждой команды. , общее затраченное время, среднее затраченное время, в микросекундах.
Мастер-раб
Функция репликации Redis разделена на две операции: синхронизацию (sync) и распространение команды (command propagate):
Операции синхронизации используются для получения состояния базы данных с сервера. Обновление до текущего состояния базы данных главного сервера;
Операция распространения команды используется для изменения состояния базы данных на главном сервере. Если состояние базы данных главного-подчиненного сервера противоречиво, пусть главный-подчиненный сервер База данных сервера возвращается в согласованное состояние.
Чтение и запись разделения
Разделение чтения и записи подходит для больших объемов доступа (настолько больших, что одна машина Redis кажется очень медленной), а операция записи намного меньше операции чтения.
Если количество запросов на чтение намного превышает количество запросов на запись, стоимость копирования данных кластера будет намного меньше стоимости запроса на чтение. В то же время, если мы сможем до некоторой степени принять несогласованность данных, мы сможем разделить чтение и запись.
кластер Redis
характеристика
1. Все узлы Redis взаимосвязаны между собой (механизм ПИНГ-ПОНГ), а внутри используется бинарный протокол для оптимизации скорости передачи и пропускной способности.
2. Сбой узла вступает в силу только тогда, когда более половины узлов кластера обнаруживают сбои.
3. Клиент напрямую подключается к узлу Redis без необходимости использования промежуточного прокси-уровня. Клиенту не нужно подключаться ко всем узлам кластера, достаточно подключиться к любому доступному узлу в кластере.
4. redis-cluster сопоставляет все физические узлы со слотом [0-16383] (не обязательно равномерно распределенным), а кластер отвечает за поддержание значения node<->slot<->.
Каждый узел Redis должен выполнить команду и объявить слот, за который он отвечает.
кластер addslots {slot_index1} {slot_index 2} {slot_index 3}
5. Кластер Redis предварительно разделен на 16384 сегмента. Когда в кластер Redis необходимо поместить ключ-значение, в зависимости от значения CRC16(key) mod 16384 решается, в какой сегмент следует поместить ключ.
Каждый экземпляр Redis знает о существовании других узлов.
Строгая последовательность не может быть гарантирована
1. Ваш клиент пишет на главный серверный узел B. 2. Главный серверный узел B отвечает вашему клиенту для подтверждения. 3. Узел главного сервера B передает запись на свои подчиненные серверы B1, B2 и B3.
Если после шага 2 данные с подчиненного сервера не отправляются и B зависает, ключ будет утерян (ключ обязательно будет утерян при сбое)
Отказоустойчивость
В процессе выбора участвуют все мастера кластера. Если более половины мастер-узлов взаимодействуют с вышедшим из строя узлом более (cluster-node-timeout), узел считается неисправным и операция аварийного переключения выполняется автоматически. сработало.
(2): Когда весь кластер становится недоступным (cluster_state:fail)? a: Если какой-либо мастер в кластере умирает, а у текущего мастера нет подчиненного устройства, кластер переходит в состояние сбоя, что также можно понимать как вход в состояние сбоя, когда сопоставление слотов кластера [0-16383] не завершено. б: Если более половины мастеров в кластере умирают, независимо от того, находится ли подчиненный кластер в состоянии сбоя.
Когда кластер недоступен, все операции в кластере недоступны и возникает ошибка ((ошибка) CLUSTERDOWN Кластер не работает).
аварийное переключение
1. Все подчиненные узлы автономного главного узла будут выбраны для выбора нового главного узла. 2. Выбранный подчиненный узел выполнит команду «Slave no one» и станет новым главным узлом. 3. Новый главный узел отменит все назначения слотов автономному главному узлу и назначит эти слоты себе. 4. Новый главный узел передает сообщение Pong в кластер. Это сообщение Pong позволяет другим узлам в кластере немедленно узнать, что узел превратился из подчиненного узла в главный узел и что главный узел взял на себя управление сервером. который изначально был отключен. Слот, который обрабатывает узел. 5. Новый главный узел начинает принимать запросы команд, относящиеся к слоту, за обработку которого он отвечает, и операция переключения при сбое завершается.
выборы господина-раба
1. Когда ведомый узел обнаруживает, что главный узел, который он реплицирует, отключился от сети, ведомый узел (здесь может быть несколько ведомых узлов, делающих запросы) отправит сообщение кластера_type_failover_auth_request в кластер, требуя права голоса (отвечает за обработку слотов). главный узел голосует за этот узел. 2. Главный узел, получивший сообщение кластера_type_failover_auth_request, будет оценивать, согласен ли он с подчиненным узлом стать новым главным узлом, исходя из своих собственных условий (текущая эпоха инициирующего узла голосования не ниже текущей эпохи голосующего узла ). Если он согласен, он вернет сообщениеuster_type_failover_auth_ack. 3. Когда от узла будет получено сообщение Cluster_type_failover_auth_ack, количество голосов будет увеличено на 1. 4. Если голоса подчиненного узла больше или равны половине голосов главных узлов в кластере (больше или равны N/2 1), этот узел станет новым главным узлом. Если ни один подчиненный узел не получит достаточного количества голосов в течение цикла настройки, кластер войдет в новый цикл настройки, и здесь будут проводиться выборы до тех пор, пока не будет выбран новый главный узел.
Все подчиненные узлы могут запрашивать мнение о том, могут ли они стать главными (те, кто голосует, будут голосовать только за свои более крупные узлы), и более половины из них могут быть (n 1)/2.
Может быть, я не могу выбрать
ограничения
1. На данный момент поддерживаются только пакетные операции с ключами в одном слоте; 2. На данный момент поддерживаются только ключевые транзакции в одном слоте; 3. Можно использовать только базу данных 0 (каждый экземпляр redis имеет 16 баз данных, переключаться между которыми можно с помощью команды select {index}); 4. Большой ключ (например, хэш, список) не может быть сопоставлен с разными узлами; 5. В настоящее время репликация «главный-подчиненный» кластера поддерживает только один уровень и не поддерживает вложенную древовидную структуру;
При расширении
шаг
1. Отправить на целевой узел кластер устанавливает слот {slot_index}, импортируя {source_node_id} 2. Отправить на исходный узел кластер setslot {slot_index} переносит {target_node_id} 3. Выполнение цикла исходного узла кластер getkeysinslot {slot_index} {count (количество ключей)} 4. Исходный узел выполняет и переносит ключ на целевой узел через конвейер. перенести {target_ip} {target_port} "" 0 {timeout} ключей {key1} {key2} {key3} 5. Повторите шаги 3 и 4. 6. Отправка уведомлений всем мастер-нодам кластера. кластер setslot {slot_index} узел {target_nodeid}
Каждый узел знает узел кластера, соответствующий каждому слоту.
Когда узел получает запрос команды, он запрашивает, может ли он обработать его самостоятельно. Если да, он обрабатывает его. Если нет, он возвращает ошибку перемещения. Ошибка перемещения содержит правильный IP-адрес узла и номер порта и возвращает его. клиент, чтобы направлять его на выполнение. И каждая последующая операция клиента. После выполнения ключа он перейдет к узлу, указанному в перемещенной ошибке.
Кодис
Уровень доступа: метод доступа может быть VIP или вызвать jodis через код Java, а затем подключиться и вызвать разные адреса прокси-сервера codis для достижения высокой доступности функций LVS и HA.
Прокси-уровень: затем средний уровень использует codis-proxy и Zookeeper для обработки направления и распределения данных. С помощью алгоритма crc32 ключи равномерно распределяются в определенном слоте разных Redis, чтобы добиться чередования, аналогичного RAID0, в старой версии. codis, Слоты необходимо выделять вручную. После codis3.2 слоты будут распределяться автоматически, что весьма удобно.
Уровень данных: наконец, codis-proxy хранит данные на реальном главном сервере redis-server. Поскольку автор codis, Хуан Дунсюй, придает большое значение согласованности данных и не допускает несогласованности данных, вызванной задержками данных, архитектура не была разработана. рассматривается с самого начала. Чтение и запись между главным и подчиненным сервером разделены. Подчиненный сервер используется только в качестве резервной архитектуры для переключения при отказе, и Zookeeper вызывает redis-sentinel для реализации функции переключения при отказе.
В Codis Codis разделит все ключи на 1024 слота. Эти 1024 слота соответствуют кластеру Redis. В Codis связь между этими 1024 слотами и экземпляром Redis будет поддерживаться в памяти. Этот слот настраивается и может быть установлен на 2048 или 4096. Это зависит от количества узлов вашего Redis. Если их слишком много, вы можете установить больше слотов.
Когда панель управления Codis Codis меняет информацию о слоте, другие узлы Codis будут отслеживать изменения слота ZooKeeper и синхронизировать их во времени. Как показано на рисунке:
zk отвечает за синхронизацию информации о слотах.
приоритетная очередь
отсортированный набор
список
Используйте несколько очередей для реализации приоритетных очередей. Задачи с разными приоритетами помещаются в разные очереди.
В то же время, когда потребители извлекают данные из очереди, они поддерживают выборку данных из нескольких очередей в порядке приоритета.
заблокирован
Запуск нескольких потребителей означает запуск нескольких клиентов для получения данных.
очередь сообщений
пабсаб
использовать
Подписчики могут подписаться на одну или несколько соответствующих тем подписки.
Издатель публикует определенную тему и ценность
Опубликованные темы будут немедленно перенаправлены потребителям, подписавшимся на эту тему. Если потребителей нет, сообщение будет удалено.
риск
Возникнет риск потери сообщения (когда машина не работает, сеть отключена или сеть прерывается и сообщения теряются)
Из-за этой особенности простой pubsub рискует потерять ответы.
Надежность данных не может быть гарантирована
Нет гарантии, что хотя бы один раз
Расширение не является гибким, и нет возможности ускорить потребление за счет добавления новых потребителей.
Вы можете использовать несколько каналов и слушать несколько раз.
список
список
1. Если в данном списке нет элемента для извлечения, соединение будет заблокировано командой BRPOP до тех пор, пока не истечет время ожидания или не будет найден извлекаемый элемент. 2. При задании нескольких ключевых параметров каждый список проверяется последовательно в соответствии с ключом параметра, и всплывает хвостовой элемент первого непустого списка. Кроме того, BRPOP ведет себя так же, как BLPOP, за исключением положения всплывающего элемента.
Если в списке нет задач, соединение будет заблокировано Существует тайм-аут для блокировки соединения. Если тайм-аут установлен на 0, вы можете подождать по беспроводной сети, пока не появится сообщение.
Используя pubsub, вы также можете уведомить потребителей о том, что они могут использовать список.
Он подходит для подписки и публикации между двумя предприятиями между A и B. Это сложнее, когда несколько направлений бизнеса означают разных потребителей.
реализация подтверждения
Поддерживайте две очереди: ожидающую очередь и таблицу выполнения (хеш-таблицу).
рабочие определяются как ThreadPool. После постановки в ожидающую очередь рабочие выделяют поток (одиночный рабочий) для обработки сообщения — добавляют текущую временную метку и имя текущего потока к целевому сообщению, записывают его в таблицу выполнения, а затем рабочий процесс потребляет сообщение. завершение Самостоятельно сотрите информацию в таблице выполнения.
Включите запланированную задачу, регулярно сканируйте очередь выполнения и проверяйте временную метку каждого элемента. Если время ожидания истекло, ThreadPoolExecutor работника проверит, существует ли поток. Если он существует, выполнение текущей задачи будет отменено, и транзакция будет отменена. будет отброшен назад. Наконец, извлеките задачу из очереди выполнения и поместите ее обратно в очередь ожидания.
Вы можете использовать zset для сортировки.
Избегайте чрезмерного использования Redis. Используйте Redis только для того, что у вас получается лучше всего, и делайте то, в чем вы не очень хороши. Чем больше вы делаете, тем больше вы открываете. Чем больше ловушек, тем труднее в конце концов сдаться. Неправильный дизайн на ранней стадии приводит к высокой частоте неудач на более позднем этапе. Rabbitmq не очень сложен в эксплуатации и обслуживании, и его можно сочетать с бизнес-системой.