redis消息通知(任务队列/优先级队列/发布订阅模式)
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消息通知(任务队列/优先级队列/发布订阅模式)的更多相关文章
- redis实现消息队列&发布/订阅模式使用
在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录. Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...
- Spring Data Redis实现消息队列——发布/订阅模式
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现. 定义:生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...
- 【转】redis 消息队列发布订阅模式spring boot实现
最近做项目的时候写到一个事件推送的场景.之前的实现方式是起job一直查询数据库,看看有没有最新的消息.这种方式非常的不优雅,反正我是不能忍,由于羡慕本身就依赖redis,刚好redis 也有消息队列的 ...
- Javascript中理解发布--订阅模式
Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...
- [转] Javascript中理解发布--订阅模式
发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布- ...
- 《JavaScript设计模式与开发实践》-- 发布-订阅模式
详情个人博客:https://shengchangwei.github.io/js-shejimoshi-fabudingyue/ 发布-订阅模式 1.定义 发布-订阅模式:发布-订阅模式又叫观察者模 ...
- Redis消息通知(任务队列和发布订阅模式)
Redis学习笔记(十)消息通知(任务队列和发布订阅模式) 1. 任务队列 1.1 任务队列的特点 任务队列:顾名思义,就是“传递消息的队列”.与任务队列进行交互的实体有两类,一类是生产者(produ ...
- rabbitmq消息队列——"发布订阅"
三."发布订阅" 上一节的练习中我们创建了一个工作队列.队列中的每条消息都会被发送至一个工作进程.这节,我们将做些完全不同的事情--我们将发送单个消息发送至多个消费者.这种模式就是 ...
- springboot集成redis实现消息发布订阅模式-双通道(跨多服务器)
基础配置参考https://blog.csdn.net/llll234/article/details/80966952 查看了基础配置那么会遇到一下几个问题: 1.实际应用中可能会订阅多个通道,而一 ...
随机推荐
- zookeeper基本概念
1.集群角色 Leader,Follower,Observer Leader服务器是整个zookeeper集群工作机制中的核心 Follower服务器是zookeeper集群状态的跟随者 Observ ...
- 在Linux终端安装Julia
官方参考文档:https://julialang.org/downloads/platform.html#generic-binaries 一.centos终端安装 打开Linux终端输入 sudo ...
- C++中模板的特化与偏特化
1.引言 C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现.目前,STL在C++社区中得到了广泛的关注.应用和研究.理 ...
- 函数式语言(Functional language)简单介绍
函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型. 函数式语言有:Haskell,Clean,M ...
- wire [7:0] regAddr; 理解
首先要指出的是wire[7,0]a和wire[8,1]a这样的表达在verilog中是错误的,应该写成wire[7:0]a和wire[8:1]a wire[7:0]a表示定义了一个wire型数据,该数 ...
- 【原创】MIPS相关
MIPS是单字长定点指令平均执行速度 Million Instructions Per Second的缩写. 路由器等嵌入式系统多采用MIPS和ARM两种指令架构,最近在研究路由器,借机总结一下基于M ...
- vim语法
在任何目录输入命令“vim <文件名>”就可以使用vim编辑文件了. 打开vim后,默认的是命令模式,输入i进入编辑模式,这个时候你可以编辑文件了.在编辑模式下按Esc键回到命令模式,在命 ...
- python day27--网络编程
一‘.网络基础 1.什么是IP IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一种统 ...
- python day28--json,pickle,hashlib,logging
一.json格式的限制 1.json格式的key必须是字符串数据类型,如果是数字dumps后会被转为字符串. # dic = {1:2,3:4} # str_dic = json.dumps(dic) ...
- SpringMVC 的<mvc:resources>使用映射路径展示文件服务器上的图片
<servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springfr ...