[一]任务队列的好处
--->松耦合:生产者和消费者无需知道彼此实现的细节,只需要约定好任务的描述格式。这使得生产者和消费者可以由不同的团队使用不同的编程语言编写。
--->易于扩展:消费者可以有多个,而且可以分布在不同的机器。可以轻易降低单台服务器的负载。
 
[二]使用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. 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队

    传送门 Description 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum ...

  2. sed 用法 转https://www.cnblogs.com/Dev0ps/p/8441255.html

    假设文档内容如下: [root@localhost ~]# cat /tmp/input.txt null test 要求:在1111之前添加AAA,方法如下: sed -i 's/指定的字符/要插入 ...

  3. Human life FZU - 2295 最大权闭合子图(第一次遇到被教育了)

    Xzz is playing a MMORPG "human life". In this game, there are N different skills. Some ski ...

  4. bzoj 1179 [Apio2009]Atm 缩点+最短路

    [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 4290  Solved: 1893[Submit][Status][Dis ...

  5. [技巧篇]01.Servlet的优化模版代码

    Servlet.java的模版 #---------------------------------------------# # <aw:description>Template for ...

  6. 数据结构:hash_map

    在C++11以上的开发环境中,请直接把map替换成unordered_map,不要使用hash_map 之前我们专门有一篇介绍哈希表,多维哈希表的博文,当时就是以map举例子,然后说了一句把map替换 ...

  7. [洛谷P3527] [POI2011]MET-Meteors

    洛谷题目链接:[POI2011]MET-Meteors 题意翻译 Byteotian Interstellar Union有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1 ...

  8. javascript 访问cookie信息

    在Javascript脚本里,一个cookie 实际就是一个字符串属性.当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称和值.每个cookie除了 name ...

  9. 要back的题目 先立一个flag

    要back的题目 目标是全绿!back一题删一题! acmm7 1003 1004 acmm8 1003 1004 sysu20181013 Stat Origin Title Solved A Gy ...

  10. 【BZOJ2946】公共串 [SAM]

    公共串 Time Limit: 3 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 给出几个由小写字母构成的单词,求它们最 ...