[一]任务队列的好处
--->松耦合:生产者和消费者无需知道彼此实现的细节,只需要约定好任务的描述格式。这使得生产者和消费者可以由不同的团队使用不同的编程语言编写。
--->易于扩展:消费者可以有多个,而且可以分布在不同的机器。可以轻易降低单台服务器的负载。
 
[二]使用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. bzoj1177 [Apio2009]Oil 二维前缀最大值,和

    [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2300  Solved: 932[Submit][Status][Disc ...

  2. React Mixin

    为什么使用 Mixin ? React为了将同样的功能添加到多个组件当中,你需要将这些通用的功能包装成一个mixin,然后导入到你的模块中. 可以说,相比继承而已,React更喜欢这种组合的方式. 写 ...

  3. [LeetCode] 17. Letter Combinations of a Phone Number ☆☆

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  4. mysql 服务端事务和客户端事务对比分析

    之前做mysql事务测试的时候都是在mysql服务端存储过程里面包含事务. 例如: CREATE DEFINER=`root`@`localhost` PROCEDURE `Test`(out deb ...

  5. [cerc2012][Gym100624B]20181013

  6. 【bzo1579】拆点+dijkstra优先队列优化+其他优化

    题意: n个点,m条边,问从1走到n的最短路,其中有K次机会可以让一条路的权值变成0.1≤N≤10000;1≤M≤500000;1≤K≤20 题解: 拆点,一个点拆成K个,分别表示到了这个点时还有多少 ...

  7. 【51NOD-0】1018 排序

    [算法]排序 #include<cstdio> #include<algorithm> using namespace std; ]; int main() { scanf(& ...

  8. 基本控件文档-UISwitch属性---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  9. Desert King(POJ2728+最优比率生成树+二分)

    题目链接:http://poj.org/problem?id=2728 题目: 题意:求一颗生成树,使得费用与距离的比值最小,其中距离等于两点之间的平面欧拉距离,费用为z坐标之差. 思路: 由上图我们 ...

  10. MongoDB 数据库(1)

    数据库 MongoDB (芒果数据库) 数据存储阶段 文件管理阶段 (.txt .doc .xls) 优点 : 数据可以长期保存 可以存储大量的数据 使用简单 缺点 : 数据一致性差 数据查找修改不方 ...