1、任务队列

对于发送邮件或者是复杂计算这样的操作,常常需要比较长的时间,为了不影响web应用的正常使用,避免页面显示被阻塞,常常会将此类任务存入任务队列交由专门的进程去处理。

队列最基础的方法如下:

有新任务的时候,通过lpush推送任务到队列中......while(true){
    if(队列有无新任务)
        有,则rpop取出新任务
    else
        等待一段时间,避免频繁检查队列
}

对于上述的策略,redis有更有一些的方法,即使用BRPOP命令

有新任务的时候,通过lpush推送任务到队列中
......
while(true){
    BRPO取出新任务
    执行任务
}

如果队列中没有元素,则会阻塞列表直到等待超时或发现可弹出元素为止。假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。

brpop命令格式如:brpop 列表键名 等待时间

1)如果等待时间设置为0,则表示不限制等待时常。经测试,开启两个redis客户端连接,当客户端A被此命令阻塞时,另一个 客户端B王队列在推送任务,客户端A即刻取出该新任务。

2)如果设置了等待时间,则超时后会返回nil和等待时长。

2、优先级队列

按照上面所说,邮件任务可以通过队列处理,但邮件发送任务可能存在优先级的区别,对于验证码这类的邮件,优先级要高于订阅类的邮件,如果通过一个队列来处理,肯定是不合理的。幸运的是,redis考虑到了这一点,brpop可以支持多个键值。如设queue:verifycode.email为验证码邮件,queue:channel:email为订阅类邮件,则可以这么取出任务:

brpop queue:verifycode.email queue:channel:email 0

按照键值的排序从左至右,brpop会优先取出queue:verifycode.email的任务进行处理,如果该队列没有任务处理,则再取出优先级次之的队列任务。

3、发布/订阅模式

订阅频道tmpchannel。返回消息:2)表示订阅成功的频道名称 3)表示当前客户端订阅的频道数量:

> subscribe tmpchannel
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "tmpchannel"
) (integer) 

取消订阅。如果命令后不说明要取消订阅的频道名称,则会取消所有订阅。当3)是0的时候,表示当前退出了订阅状态。

> unsubscribe tmpchannel
) "unsubscribe"
) "tmpchannel"
) (integer) 

发布消息。返回消息:订阅者的数量:

> publish tmpchannel hello
(integer) 

待发布消息后,订阅者即可能收到发布者发布的信息。格式:2)表示频道 3)发布的消息:

) "message"
) "tmpchannel"
) "hello"

redis还支持glob通配符订阅频道,如:

psubscribe channel1.?*

该命令可订阅满足该glob通配符的所有频道。相对应的,取消订阅即用punsubscribe命令

punsubscribe channel1.?*

采用通配符订阅的客户端返回的信息格式如下:

) "pmessage"
) "chanel1.?*"
) "chanel1.2.3"
) "Hello World !"

redis消息通知(任务队列/优先级队列/发布订阅模式)的更多相关文章

  1. redis实现消息队列&发布/订阅模式使用

    在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录.   Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...

  2. Spring Data Redis实现消息队列——发布/订阅模式

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现. 定义:生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...

  3. 【转】redis 消息队列发布订阅模式spring boot实现

    最近做项目的时候写到一个事件推送的场景.之前的实现方式是起job一直查询数据库,看看有没有最新的消息.这种方式非常的不优雅,反正我是不能忍,由于羡慕本身就依赖redis,刚好redis 也有消息队列的 ...

  4. Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...

  5. [转] Javascript中理解发布--订阅模式

    发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布- ...

  6. 《JavaScript设计模式与开发实践》-- 发布-订阅模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-fabudingyue/ 发布-订阅模式 1.定义 发布-订阅模式:发布-订阅模式又叫观察者模 ...

  7. Redis消息通知(任务队列和发布订阅模式)

    Redis学习笔记(十)消息通知(任务队列和发布订阅模式) 1. 任务队列 1.1 任务队列的特点 任务队列:顾名思义,就是“传递消息的队列”.与任务队列进行交互的实体有两类,一类是生产者(produ ...

  8. rabbitmq消息队列——"发布订阅"

    三."发布订阅" 上一节的练习中我们创建了一个工作队列.队列中的每条消息都会被发送至一个工作进程.这节,我们将做些完全不同的事情--我们将发送单个消息发送至多个消费者.这种模式就是 ...

  9. springboot集成redis实现消息发布订阅模式-双通道(跨多服务器)

    基础配置参考https://blog.csdn.net/llll234/article/details/80966952 查看了基础配置那么会遇到一下几个问题: 1.实际应用中可能会订阅多个通道,而一 ...

随机推荐

  1. 错误:Bean property 'sessionFactory' is not writable or has an invalid setter method.

    Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'sessionFactory' ...

  2. day058 聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁

    1.聚合(aggregate) 聚合的主要语法: from django.db.models import Avg , Max , Min , Count models.类名 .objects.all ...

  3. Linux 搭建Hadoop集群 成功

    内容基于(自己的真是操作步骤编写) Linux 搭建Hadoop集群---Jdk配置 Linux 搭建Hadoop集群 ---SSH免密登陆 一:下载安装 Hadoop 1.1:下载指定的Hadoop ...

  4. chrome扩展应用实例

    chrome extensions 基本组成,唯一必要的文件就是manifest.json这个应用的配置清单 manifest.json中前三个参数为必要参数,其他的可选: { "name ...

  5. RabbitMQ使用介绍及实例

    消息列队不做过多解释了,直接讲讲rabbitmq的基本概念和路由模式. 一.安装及基本概念 rabbitmq是基于erlang编写的,所以安装rabbitmq之前需要安装erlang的环境,配置环境变 ...

  6. GeoServer java.io.IOException: No such resource: generic.sld No such resource: generic.sld

    原因是 发布 图层时 没有设置类型 默认 generic 但是我们的数据库中 没有这个 解决办法: 点击 图层--点击 相应的 图层名称 ---发布  --- WMS Settings 下面的Defa ...

  7. Python基础05_str_补充

    继续学习中, 补充一些str 的索引.切片.长度.循环输出等. #!/usr/bin/env python # coding:utf-8 # 通过下标索引获取字符串中的某个字符 # 1. 索引 tes ...

  8. Linux基础知识_Shell编程笔记

    以下是一些 常用功能 , 基于 centos 6.5 x64 # cp /etc/localtime /etc/localtime.org # rm /etc/localtime # ln -s /u ...

  9. VirtualBox安装CENTOS7.3常见问题

    1 DHCP 问题无法上网解决 :sudo dhclient 2 安装宝塔面板:yum install -y wget && wget -O install.sh http://dow ...

  10. VS2013/VS2015/VS2017通过oschina托管代码

    1.到http://git.oschina.net注册账号,创建项目,这一步不做详细描述,创建后效果如图 2.打开VS创建项目,为了测试,创建一个空白解决方案 3.把解决方案添加到源代码管理(这一步仅 ...