Ссылаться наБлог Отлично и ярко Талант/блог/деталь…
Я впервые пишу блог о Наггетс, мой друг милый, пожалуйста, поддержите меня~(^__^) Ух
1. Что такое очередь сообщений
Это связанный список сообщений и механизм асинхронной обработки данных.
PS: можно понять, что данные сообщения хранятся в списке списка redis, а затем в порядке очереди (первый пришел, первый вышел) в соответствии с методом очередности (слева на входе, справа на выходе; справа на входе). и ушел)
2. Сценарии приложений, которые можно использовать
В основном применяются некоторые отложенные или асинхронные сценарии работы Например: отправка электронных писем, отправка коротких сообщений, транскодирование видео, транскодирование изображений, хранение журнала, импорт данных и т. д. При отправке электронных писем или текстовых сообщений мы не хотим, чтобы программа оставалась вечно и ждала, пока отправка будет успешной, а обрабатываем ее асинхронно, то есть добавляем данные электронной почты для отправки в очередь сообщений, а затем отправлять электронные письма асинхронно в соответствии с последовательностью очереди.
3. Преимущества
Это может не только увеличить нагрузку на систему, но и уменьшить потерю данных, вызванную перегрузкой сети. Это можно понимать как: обработка данных асинхронно, это не будет оказывать слишком большой нагрузки на сервер за один раз и не будет напрямую работать с базой данных, уменьшая нагрузку на базу данных; и если сеть заблокирована, если она была добавлены в очередь сообщений, тогда данные будут нормально выполняться, без потерь
В-четвертых, Redis реализует схему очереди
вся идея: Очередь сообщений, упомянутая ранее, эквивалентна постановке в очередь в окне банка: первый номер вызова ставится в очередь (присоединяется к очереди сообщений redis), а затем очередь ставится в очередь в соответствии с соответствующим номером вызова.
Некоторые особенности Redis: Redis предназначен для кеширования, но в силу своих особенностей может использоваться для очередей сообщений. У него есть несколько API-интерфейсов блокировки, которые можно использовать. Именно эти API-интерфейсы блокировки позволяют использовать его для очередей сообщений. ; Кроме того, другие функции очередей сообщений, такие как FIFO (first-in-first-out), также легко реализовать.Вам нужен только объект списка, чтобы получать данные с начала и заполнять данные с конца; Redis может создавать очереди сообщений благодаря к его объекту списка blpop Интерфейс brpop и некоторые интерфейсы Pub/Sub (публикация/подписка) являются блокирующими версиями, поэтому их можно использовать в качестве очередей сообщений.
Вариант первый:
Используйте команду Redis lpush/rpop (rpush/lpop), чтобы просто реализовать список слева, справа или справа и слева. Затем вам нужно открыть задачу потока или задачу по времени или метод опроса и постоянно вызывать метод rpop, чтобы проверить, есть ли в списке ожидающие сообщения. Недостаток: каждый вызов будет инициировать соединение, что приведет к ненужным потерям. 1) Если скорость производителя больше, чем скорость потребления потребителя, длина очереди сообщений будет продолжать увеличиваться, и она будет занимать много места в памяти в течение длительного времени. 2) Если время ожидания слишком велико, некоторые чувствительные ко времени сообщения не могут быть обработаны, а время ожидания слишком мало, что также приведет к относительно большим накладным расходам на соединение.
Вариант 2: (рекомендуется)
Измените команды lpop и rpop в решении 1, чтобы использовать blpop (слева) и brpop (справа). Эта команда будет возвращаться только в том случае, если есть элемент, в противном случае она будет заблокирована до тех пор, пока тайм-аут не вернет значение null. Реализация блокировки: опрос не требуется. Когда у ключа очереди есть данные, он ответит. Здесь прочитанное сообщение не будет читаться в цикле, а будет заблокировано до тех пор, пока не появится сообщение. Директива также предоставляет параметры приоритета и времени ожидания. Реализовать команду приоритета очереди: brpop queue1 queue2 ... Таким образом, когда в очереди 1 есть данные, может быть достигнута приоритетная обработка, например окно VIP банка и т. д. Реализовать тайм-аут и выход: brpop Redis по умолчанию не имеет параметра тайм-аута (или значение по умолчанию равно 0 (с)), и он всегда будет в процессе Команда реализации: brpop queue1 timeout
Пять, идеи реализации кода
Следующее использует вторую идею внедрения Пример: Отправить уведомления о почте пользователя платформы (несколько сценариев, например, по отправке кодов проверки, сброс паролей и т. Д.)
# 第一步 请求发送的平台用户信息进队
//...... 获取用户信息代码省略
$userInfo = ['id'=>1, 'name'=>'张三', 'email'=>'393364227@qq.com'];
$redis->lpush('sendEmailQueue', serialize($userInfo)); //serialize 序列化数组信息,转为字符串
//..... 同步处理,相应页面 发送成功等信息
# 第二步 在另一个接口类出队,并且处理消息
$userInfo = unserialize(brpop('sendEmailQueue'));
//sendEmail 开始发送邮件操作
# 第三步 将第二步的实现接口添加到进程任务,并且开启进程保护
//可以使用linux下的Supervisor来做进程保护
//启动队列进程,即可实现消息队列去发送邮件了
The End.