написать впереди
2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! Адрес гитхаба:GitHub.com/thinking Хан…
1. Архитектура публикации и подписки Redis
Redis предоставляет функцию публикации и подписки, которую можно использовать для передачи сообщений.Механизм публикации и подписки Redis включает три части: издатель, подписчик и канал.
И издатели, и подписчики являются клиентами Redis, а Channel — серверной стороной Redis.Издатели отправляют сообщения в определенный канал, и подписчики, подписавшиеся на этот канал, могут получать сообщения. Этот механизм публикации и подписки Redis аналогичен публикации и подписке на основе темы, а канал эквивалентен теме.2. Функция публикации и подписки Redis
(1) Отправить сообщение
Redis использует команду PUBLISH для отправки сообщений, а возвращаемое значение — это количество подписчиков, получивших сообщение.
(2) Подписаться на канал
Redis использует команду SUBSCRIBE для подписки на канал.Возвращаемое значение включает в себя канал, на который подписан клиент, количество каналов, на которые в настоящее время подписано, и полученные сообщения, где subscribe указывает, что канал был успешно подписан.
(3) Сопоставление с образцом
Функция сопоставления шаблонов позволяет клиентам подписываться на каналы, соответствующие шаблону. Redis использует PSUBSCRIBE для подписки на все каналы, соответствующие шаблону. Используйте ""представляет режим","Может быть заменено любым значением.
Предполагая, что клиент подписывается на определенный режим и канал, который соответствует режиму одновременно, сообщение, отправленное на этот канал, будет получено клиентом дважды, но типы этих двух сообщений различны, одно сообщение тип, а другой — тип сообщения, имеет тип pmessage, но его содержимое такое же.(4) Отменить подписку
Redis использует команды UNSUBSCRIBE и PUNSUBSCRIBE для отказа от подписки, и возвращаемое значение аналогично подписке. Поскольку операция подписки Redis блокируется, после того, как клиент подпишется на канал или режим, он останется в состоянии подписки до выхода. В командах SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE и PUNSUBSCRIBE возвращаемое значение содержит количество каналов и режимов, на которые в данный момент подписан клиент.Когда это число становится равным 0, клиент автоматически выходит из состояния подписки.
3. Реализация публикации и подписки Redis
Поскольку Redis — это система с открытым исходным кодом, мы можем просмотреть детали внутренней реализации через ее исходный код.
(1) ПОДПИСАТЬСЯ
Когда клиент подписывается на канал, Redis должен связать канал клиенту. Прежде всего, в клиентской структуре клиента есть атрибут pubsub_channels, который указывает на все каналы подписанные клиентом. Это словарь тип, реализованный через хеш-таблицу, и каждый элемент содержит ключ пара значений И указатель на следующий элемент, каждая подписка вставляет в него узел, ключ представляет собой канал для подписки на подписку, и значение NULL. Затем, в структуре Redisserver, представляющей сторона сервера, также есть атрибут, называемый pubsub_channels, но здесь он представляет все каналы на стороне сервера, а клиенты подписаны на этот канал, это также тип словаря при вставке узла, Ключ представляет канал, и значение является связанным списком всех клиентов, подписанных на канал. Наконец Redis уведомляет клиента, что его подписка была успешной.(2) PПОДПИСАТЬСЯ
Когда клиент подписывается на схему, Redis также необходимо привязать схему к клиенту. Во-первых, в структуре client есть атрибут pubsub_patterns, в котором представлены все паттерны, на которые подписан клиент.Это тип связанного списка.Каждый узел включает в себя подписанный паттерн и указатель на следующий узел.Каждый раз при подписке к схеме, вы вставляете в нее узел. Затем в структуре redisServer есть атрибут pubsub_patterns, который представляет все шаблоны на сервере и клиентов, которые подписываются на эти шаблоны.Это также тип связанного списка.При вставке узла каждый узел должен включать подписанная схема, а также клиенты, подписанные на эту схему, и указатель на следующий узел.(3) ПУБЛИКАЦИЯ
Когда клиент отправляет сообщение в канал, Redis сначала находит узел, ключ которого является каналом, в pubsub_channels в структуре redisServer, и проходит значение узла, то есть проходит всех клиентов, подписанных на канал, и проходит значение узла.сообщения этим клиентам. Затем пройдитесь по pubsub_patterns в структуре redisServer, найдите узел, содержащий шаблон канала, и отправьте сообщение клиенту, подписавшемуся на шаблон.4. Приложение Redis для публикации и подписки в Redis
Функция публикации и подписки Redis не имеет ничего общего с хранилищем данных в Redis, она не повлияет на пространство ключей Redis, то есть не повлияет на данные, хранящиеся в Redis, но через механизм публикации и подписки Redis также предоставляет другую функцию, а именно Keyspace Notification, которая позволяет клиентам узнать, есть ли события, которые изменяют данные в Redis, подписавшись на определенный канал. Например, если клиент удаляет данные, ключ которых является mykey в Redis, эта операция вызовет два сообщения, mykey del и del mykey, первое из которых относится к keyapce канала, указывающее на изменение пространства ключей, а второе принадлежит ключевое событие канала, указывающее, что выполнение выполняется.
5. Сравнение между публикацией и подпиской Redis и ActiveMQ
(1) ActiveMQ поддерживает различные протоколы сообщений, включая AMQP, MQTT, Stomp и т. д., а также поддерживает спецификацию JMS, но Redis не поддерживает эти протоколы; (2) ActiveMQ обеспечивает постоянство, но Redis не может постоянно хранить сообщения.После отправки сообщения, если его не получат подписчики, сообщение будет потеряно; (3) ActiveMQ предоставляет гарантию передачи сообщения. Когда время ожидания подключения клиента истекает или происходит откат транзакции, сообщение будет повторно отправлено клиенту. Redis не предоставляет гарантию передачи сообщения. Короче говоря, функции, предоставляемые ActiveMQ, намного сложнее, чем функция публикации и подписки Redis.В конце концов, Redis не предназначен для публикации и подписки, но если Redis уже существует в системе и требуются базовые функции публикации и подписки, необходимо установить ActiveMQ, т.к. большинство функций, предоставляемых ActiveMQ, могут не использоваться, а механизм публикации и подписки Redis может удовлетворить потребности.