Redis消息通知(任务队列和发布订阅模式)
Redis学习笔记(十)消息通知(任务队列和发布订阅模式)
1. 任务队列
1.1 任务队列的特点
任务队列:顾名思义,就是“传递消息的队列”。与任务队列进行交互的实体有两类,一类是生产者(producer),另一类则是消费者(consumer)。生产者将需要处理的任务放入任务队列中,而消费者则不断地从任务独立中读入任务信息并执行。
任务队列的好处:
- 松耦合。生产者和消费者只需按照约定的任务描述格式,进行编写代码。
- 易于扩展。多消费者模式下,消费者可以分布在多个不同的服务器中,由此降低单台服务器的负载。
1.2 Redis实现任务队列
使用Redis实现任务队列首先想到的就是Redis的列表类型,因为在Redis内部,==列表类型是由双向链表实现==的。
实现任务队列,只需让生产者将任务使用LPUSH加入到某个键中,然后另一个消费者不断地使用RPOP命令从该键中取出任务即可。
//生产者只需将task LPUSH到队列中
127.0.0.1:6379> LPUSH queue task
(integer) 1
127.0.0.1:6379> LRANGE queue 0 -1
1) "task"
//消费者只需从队列中LPOP任务,如果为空则轮询。
127.0.0.1:6379> LPOP queue
"task"
BLPOP指令可以在队列为空时处于阻塞状态。就不用处于轮询的状态。
127.0.0.1:6379> BLPOP queue 0 //0表示无限制等待
//消费者当队列为空则处于阻塞状态。
//生产者将task LPUSH到队列中,处于阻塞状态的消费者离开返回
127.0.0.1:6379> LPUSH queue task
(integer) 1 //消费者立刻“消费”,取出task。
127.0.0.1:6379> BLPOP queue 0
1) "queue"
2) "task"
(13.38s)
1.3 优先级队列
当一个队列中有许多任务仍然没有来得及被消费者及时消费时,如果出现紧急的消息,则不得不等待队列中的任务被一一取出,因此,需要实现一个优先级队列,当优先级队列不为空时,消费者优先取出优先级队列中的任务去执行。
BLPOP命令可以同时接收多个键BLPOP key [key ...] timeout,当所有键(列表类型)都为空时,则阻塞,当其中一个有元素则会从该键返回。==如果多个键都有元素则按照从左到右的顺序取第一个键中的一个元素,因此可以借此特性实现优先级队列。==
127.0.0.1:6379> LPUSH queue1 first
(integer) 1
127.0.0.1:6379> LPUSH queue2 second
(integer) 1 //当两个键都有元素时,按照从左到右的顺序取第一个键中的一个元素
127.0.0.1:6379> BRPOP queue1 queue2 0
1) "queue1"
2) "first"
127.0.0.1:6379> BRPOP queue1 queue2 0
1) "queue2"
2) "second"
2. “发布/订阅”模式
“发布/订阅”(publish/subscribe)模式同样可以实现进程间通信,==订阅者可以订阅一个或多个频道(channel),而发布者可以向指定的频道发送消息,所有订阅次频道的订阅者都会收到次消息。==
2.1 命令实践
- PUBLISH
- 将信息 message 发送到指定的频道 channel。返回收到消息的客户端数量。
- SUBSCRIBE
- 订阅给指定频道的信息。
- 一旦客户端进入订阅状态,客户端就只可接受订阅相关的命令SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE除了这些命令,其他命令一律失效。
- UNSUBSCRIBE
- 取消订阅指定的频道,如果不指定,则取消订阅所有的频道。
127.0.0.1:6379> PUBLISH channel1.1 test
(integer) 0 //有0个客户端收到消息 127.0.0.1:6379> SUBSCRIBE channel1.1
Reading messages... (press Ctrl-C to quit)
1) "subscribe" //"subscribe"表示订阅成功的信息
2) "channel1.1" //表示订阅成功的频道
3) (integer) 1 //表示当前订阅客户端的数量
//当发布者发布消息时,订阅者会收到如下消息
1) "message" //表示接收到消息
2) "channel1.1" //表示产生消息的频道
3) "test" //表示消息的内容
//当订阅者取消订阅时会显示如下:
127.0.0.1:6379> UNSUBSCRIBE channel1.1
1) "unsubscribe" //表示成功取消订阅
2) "channel1.1" //表示取消订阅的频道
3) (integer) 0 //表示当前订阅客户端的数量 //注:在redis-cli中无法测试UNSUBSCRIBE命令
- 取消订阅指定的频道,如果不指定,则取消订阅所有的频道。
PSUBSCRIBE
- 订阅给定的模式(patterns)。
PUNSUBSCRIBE
- 可以退订指定的规则,如果没有参数会退订所有的规则。
127.0.0.1:6379> PSUBSCRIBE channel1.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "channel1.*"
3) (integer) 1
//等待发布者发布消息
127.0.0.1:6379> PUBLISH channel1.1 test1.1
(integer) 1 //发布者在channel1.1发布消息 1) "pmessage" //表示通过PSUBSCRIBE命令订阅而收到的
2) "channel1.*" //表示订阅时使用的通配符
3) "channel1.1" //表示收到消息的频道
4) "test1.1" //表示消息内容 127.0.0.1:6379> PUBLISH channel1.2 test1.2
(integer) 1 //发布者在channel1.2发布消息 1) "pmessage"
2) "channel1.*"
3) "channel1.2"
4) "test1.2" 127.0.0.1:6379> PUBLISH channel1.3 test1.3
(integer) 1 //发布者在channel1.3发布消息 1) "pmessage"
2) "channel1.*"
3) "channel1.3"
4) "test1.3" 127.0.0.1:6379> PUNSUBSCRIBE channal1.*
1) "punsubscribe" //退订成功
2) "channal1.*" //退订规则的通配符
3) (integer) 0 //表示当前订阅客户端的数量PUNSUBSCRIBE应该注意一下两点:
- 使用PUNSUBSCRIBE命令只能退订通过PSUBSCRIBE命令订阅的规则,不会影响SUBSCRIBE订阅的频道。
- 使用PUNSUBSCRIBE命令退订某个规则时不会将其中通配符展开,而是严格的进行==字符串匹配==,所以
PUNSUBSCRIBE *无法退订PUNSUBSCRIBE channal1.*规则,而必须使用PUNSUBSCRIBE channal1.*才能退订
Redis消息通知(任务队列和发布订阅模式)的更多相关文章
- redis消息通知(任务队列/优先级队列/发布订阅模式)
1.任务队列 对于发送邮件或者是复杂计算这样的操作,常常需要比较长的时间,为了不影响web应用的正常使用,避免页面显示被阻塞,常常会将此类任务存入任务队列交由专门的进程去处理. 队列最基础的方法如下: ...
- Redis消息通知
Redis的消息通知通过列表类型实现,分为两种模式:阻塞式.发布/订阅式: 阻塞式 顾名思义,消息生产者负责生产消息,并将消息放到队列的一端,消息的消费者负责消费消息,从队列的另一端取出消息,然后对其 ...
- 观察者模式 vs 发布-订阅模式
我曾经在面试中被问道,_“观察者模式和发布订阅模式的有什么区别?” _我迅速回忆起“Head First设计模式”那本书: 发布 + 订阅 = 观察者模式 “我知道了,我知道了,别想骗我” 我微笑着回 ...
- redis实现消息队列&发布/订阅模式使用
在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录. Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...
- springboot集成redis实现消息发布订阅模式-双通道(跨多服务器)
基础配置参考https://blog.csdn.net/llll234/article/details/80966952 查看了基础配置那么会遇到一下几个问题: 1.实际应用中可能会订阅多个通道,而一 ...
- 15天玩转redis —— 第九篇 发布/订阅模式
本系列已经过半了,这一篇我们来看看redis好玩的发布订阅模式,其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果 ...
- redis发布/订阅模式
其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果博主发表了文章,那么100个人就会同时收到通知邮件,除了这个 场 ...
- Redis进阶篇:发布订阅模式原理与运用
"65 哥,如果你交了个漂亮小姐姐做女朋友,你会通过什么方式将这个消息广而告之给你的微信好友?" "那不得拍点女朋友的美照 + 亲密照弄一个九宫格图文消息在朋友圈发布大肆 ...
- redis的发布订阅模式
概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer { /* Pubsub */ // 字典,键为频道, ...
随机推荐
- 洛谷 P2466 Sue的小球 解题报告
P2466 [SDOI2008]Sue的小球 题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当 ...
- 修复VirtualBox "This kernel requires the following features not present on the CPU: pae Unable to boot – please use a kernel appropriate for your CPU"
异常处理汇总-开发工具 http://www.cnblogs.com/dunitian/p/4522988.html 修复VirtualBox "This kernel requires ...
- Hashtable 删除元素, 抛出异常 java.util.ConcurrentModificationException
今天在对一个Hashtable对象进行 搜索 -> 删除 操作时遇到的一个问题,开始的使用我使用的是Hashtable的Iterator,然后直接执行: Hashtable.remove(key ...
- 走进Java中的持有对象(容器类)【二】Collection
概述 通过前文的学习,我们对容器的分类及常用容器类的作用有了基本的认识.本文将针对Collection容器的功能与使用进行细致分析. 基本操作 Collection集合抽象出的目的是为存放独立元素的序 ...
- 第1课:SQL注入原理深度解析
对于Web应用来说,注射式攻击由来已久,攻击方式也五花八门,常见的攻击方式有SQL注射.命令注射以及新近才出现的XPath注射等等.本文将以SQL注射为例,在源码级对其攻击原理进行深入的讲解. 一.注 ...
- linux_shell使用
一.hash命令 说明:linux系统下会有一个hash表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样.第一次执行命令shell解释器默 ...
- HDFS集群PB级数据迁移方案-DistCp生产环境实操篇
HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...
- GoLang基础数据类型--->字典(map)详解
GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...
- 安装完office后 在组件服务里DCOM配置中找不到
这个主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,在里就能看到excel组件了
- java字符串转义,把<>转换成<>等字符【原】
java字符串转义,把<>转换成<>等字符 使用的是commons-lang3-3.4 中的StringEscapeUtils类 package test; import ja ...