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. spring+springMvc+struts的SSH框架整合

    1.建立一个web项目 2.导入SSH框架所需jar包 3.配置web.xml文件 <?xml version="1.0" encoding="UTF-8" ...

  2. 升级nginx 和nchan

    #下载sudo wget http://nginx.org/download/nginx-1.14.0.tar.gzsudo wget https://github.com/slact/nchan/a ...

  3. 解决ios兼容性问题

    其实也不算兼容性问题 在做一个手指切换动画时,在安卓显示正常但是在iOS上切换图片时整个页面会向上或向下窜,这样非常印象美观,这种现象是由于ios自带的下拉刷新功能能影响的: 解决方法: 添加阻止事件 ...

  4. Android Studio安装时候遇到HAXM问题

    之前抽风,把AS写在卸载掉了,再进行重装时候就爆炸了,一直提示下面这个错误: <一>failed to install Intel HAXM. For details, pleasse c ...

  5. Linux:挂载、卸载光盘

    挂载.卸载光盘 前提准备: 已经安装好虚拟机 安装好的虚拟机与镜像系统最好一致 前提配置 1.选择虚拟机 2.选择设置 3.选择CD/DVD 4.选择ISO镜像文件,选择设备状态,都勾选 5.ps如果 ...

  6. 2017年4月7日16:18:17 java8 常用记录

    List<String> customerUids = customerTagModel.stream().map(CustomerTagModel::getCustomerUid)   ...

  7. 给a链接跳转后的页面添加class

    $(document).ready(function(){ var test = window.location.href;//获取到当前页面的href // console.log(test); / ...

  8. 【转】matlab学习(5) 读取excel文件

    转自:https://blog.csdn.net/thy19988/article/details/78489623 1.使用函数xlsread读取单个文件(1)num=xlsread(filenam ...

  9. mvc项目用log4net 记录错误日志

    1.  首先下载lognet 下载地址 http://logging.apache.org/log4net/download_log4net.cgi 2.找到bin文件中的net文件夹  之后看你电脑 ...

  10. 机顶盒安装apk系列

    1.湖南移动九州PTV-8508机顶盒安装第三方apk包 1.先把安装包放入U盘根目录下,插入机顶盒usb口 2.查看8508机顶盒IP地址 3.使用adb工具连接机顶盒,这款盒子的adb默认端口是8 ...