[一]任务队列的好处
--->松耦合:生产者和消费者无需知道彼此实现的细节,只需要约定好任务的描述格式。这使得生产者和消费者可以由不同的团队使用不同的编程语言编写。
--->易于扩展:消费者可以有多个,而且可以分布在不同的机器。可以轻易降低单台服务器的负载。
 
[二]使用redis实现简单的任务队列(生产者消费者模型)
--->根据列表类型的存储结构实现队列
--->生产者命令:LPUSH key value[value ...] RPUSH key value[value...]
--->消费者命令:RPOP key 或BRPOP key timeout ,  LPOP key 或者 BLPOP key timeout
--->阻塞消费者命令:timeout 为0时,不设置超时时间,一直等待,直到有消息。如果设置数字,则单位为秒。
 
[三]使用redis实现优先级队列(生产者消费者模型)
--->设置多个任务队列,生产者按任务的优先级,将任务发往不同的队列
--->消费者订阅多个队列,队列的顺序:按优先级由高到低,从左侧往右侧排序。
--->结果现象:消费者每次取消息,都是从左侧往右侧取。先把优先级高的队列中任务消费完毕,才去消费优先级低的队列中的任务。实例:如下图
 
[四]使用redis实现发布订阅模型(广播模型)
--->发布者往redis中的channel发布一条消息x,所有订阅该channel的订阅者都可以得到这条消息x
--->发布者命令:PUBLISH channel message
--->订阅者命令:SUBSCRIBE channel [channel]
--->PUBLISH命令发布消息后,返回值表示,订阅到该消息的订阅者数量。如果返回0,表示无人订阅,消息不会持久化,会随即消失。后面及时有订阅者订阅了该频道,也无法订阅到之前该发布者发布的历史消息。
--->执行SUBSCRIBE命令后,客户端会进入订阅状态。处于此状态的客户端不能使用除SUBSCRIBE,UNSUBSCRIBE,PSUBSCRIBE,PUNSUBSCRIBE这四个属于“发布订阅”模式的命令之外的命令。否则会报错
--->SUBSCRIBE命令执行后,会返回三个值。第一个值是消息的类型。根据消息类型的不同,第二个,第三个值也会不同
(1)消息类型包含
=>subscibe,表示订阅成功的反馈信息。第二个值是订阅成功的频道名称,第三个值是当前客户端订阅的频道数量。
=>message,这个类型的回复是我们最关心的,它表示接收到消息。第二个值标示产生消息的频道名称,第三个值是消息的内容
=>unsubscribe.这个类型的回复表示成功取消订阅某个频道,第二个值对应的频道名称,第三个值是当前客户端订阅的频道数量。当此值返回0时,当前客户端会退出订阅状态。之后可以执行其他非“发布订阅”模式的命令。
[五]发布订阅模型:按照规则订阅
--->按规则订阅通道的语法
符号 含义
? 匹配一个字符
* 匹配任意个(包括0个)字符
[] 匹配括号间的任一字符,可以使用“-”符号表示一个范围。如[a-z][1-9]
\x 匹配字符x,用于转义符号。如果匹配“?”就需要使用\?
--->命令格式:PUSBSCRIBE  channelpattern[channelpattern...]
--->返回值四个值。
  (1)pmessage:表示是通过PUSBSCRIBE命令订阅频道接收到的。
  (2)channelpattern:表示是订阅时使用的是那个通配符
  (3)channelName:表示实际收到消息的频道命令
  (4)messageContext:表示收到消息的内容
--->使用PUSBSCRIBE命令可以重复订阅一个频道。比如客户端执行了。PUSBSCRIBE chanel.? channel.?*  那么这个时候向channel.2发送消息,则该订阅客户端将收到两条消息。同样如果客户端使用PUSBSCRIBE channel.10 channel.?* 订阅消息。则往channle1.10发送消息,该订阅客户端也会收到两条消息。但消息类型是两种message合pmessage。
 
 
[六]发布订阅模型:退订规则
--->通过匹配订阅的退订命令格式:PUNSUBSCRIBE [pattern [pattern ...]]
--->直接订阅的退订的命令格式:UNSUBSCRIBE [channel [channel ...]]
--->使用PUNSUBSCRIBE命令只能退订通过PSUBSCRIBE命令订阅规则。不会影响直接通过SUBSCRIBE命令订阅的频道
--->同样UNSUBSCRIBE命令也不会影响同过PSUBSCRIBE命令的订阅的频道。
--->容易错误的点:PUNSUBSCRIBE命令退订某个规则时,不会将匹配符号的命令规则展开。比如:用PUNSUBSCRIBE *是无法退订channel.*。而是必须使用PUNSUBSCRIBE channel.*才能退订channel.*
 

redis之(十)redis实现消息中间件的功能的更多相关文章

  1. Redis进阶实践之二十 Redis的配置文件使用详解

    一.引言 写完上一篇有关redis使用lua脚本的文章,就有意结束Redis这个系列的文章了,当然了,这里的结束只是我这个系列的结束,但是要学的东西还有很多.但是,好多天过去了,总是感觉好像还缺点什么 ...

  2. Redis(十二)flush误操作、Redis安全、处理bigkey和寻找热点key

    一.flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000. 1.缓存与存储 被误操作flush后,根 ...

  3. redis(十八):Redis 配置

    #redis.conf# Redis configuration file example.# ./redis-server /path/to/redis.conf ################# ...

  4. Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能

    Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能 背景 注册-登录-修改密码⼀般需要发送验证码,但是容易被 攻击恶意调⽤ 什么是短信-邮箱轰炸机 手机短信轰炸机是批.循环给 ...

  5. SpringCloud微服务实战——搭建企业级开发框架(三十六):使用Spring Cloud Stream实现可灵活配置消息中间件的功能

      在以往消息队列的使用中,我们通常使用集成消息中间件开源包来实现对应功能,而消息中间件的实现又有多种,比如目前比较主流的ActiveMQ.RocketMQ.RabbitMQ.Kafka,Stream ...

  6. Redis进阶实践之十 Redis主从复制的集群模式

    一.引言        Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习.从今天开始来讲一下有关Re ...

  7. Redis 简要介绍--用于讲解消息中间件

    1:安装 Redis yum install -y redis   2:编辑配置文件/etc/redis.conf,Redis作为一个消息中间件,那么应该监听于本机的外网socket上,因此修改 bi ...

  8. 关于redis的几件小事(十)redis cluster模式

    redis cluster是redis提供的集群模式. 1.redis cluster的架构 ①可以有多个master node,每个master node 都可以挂载多个slave node. ②读 ...

  9. SpringBoot开发二十-Redis入门以及Spring整合Redis

    安装 Redis,熟悉 Redis 的命令以及整合Redis,在Spring 中使用Redis. 代码实现 Redis 内置了 16 个库,索引是 0-15 ,默认选择第 0 个 Redis 的常用命 ...

  10. redis(十四):Redis 有序集合(sorted set)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

随机推荐

  1. Jsp电子商务之七 订单篇2

    从View页面,点击超链接查询订单,进入到控制器 OrderlistServlet package com.cart.web; import java.io.IOException; import j ...

  2. Kindle 电子书相关的工具软件【转】

    这里是与 Kindle 电子书相关的工具软件.它们可以帮助我们解决在日常使用电子书时所可能遇到的问题,比如 kindle 管理工具.kindle 转换工具.kindle电子书制作工具.kindle 推 ...

  3. pandas模块(数据分析)------dataframe

    DataFrame DataFrame是一个表格型的数据结构,含有一组有序的列,是一个二维结构. DataFrame可以被看做是由Series组成的字典,并且共用一个索引. 一.生成方式 import ...

  4. navicat for mysql无法连接数据库和连接数据库慢的问题

    首先在自己虚拟机上登录mysql: mysql -uroot -p 然后赋予权限 GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '1234 ...

  5. HDU 5645

    DZY Loves Balls Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others ...

  6. oracle 国外网站【转载】

    [转自]:http://www.2cto.com/database/201406/306615.html 1. http://www.oratechinfo.co.uk/ http://www.ora ...

  7. [POI2008]BLO-Blockade

    https://www.luogu.org/problem/show?pid=3469 题目描述 There are exactly  towns in Byteotia. Some towns ar ...

  8. 安装显卡后蓝屏0x00000116解决办法

    1. 亲自遇到蓝屏的问题. 2. 进入安全模式后重装系统,成功. 3. 安装驱动,软件没毛病.安装显卡驱动后,蓝屏. 4. 查看蓝屏错误代码0x00000116, 百度后查看到是显卡驱动的问题. 5. ...

  9. cocos2dx中启用lua脚本

    AppDelegate 的 applicationDidFinishLaunching 方法中加载Lua引擎 bool AppDelegate::applicationDidFinishLaunchi ...

  10. 深入理解 Java 多线程核心知识:跳槽面试必备

    多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关 ...