一.场景介绍

最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知。经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低。

二.什么是redis pub/sub

资料查看

大家在看我的blog的同时可以打开redis官方对于redis pub/sub的介绍,感觉看英文文档吃力的话 :cry: ,可以看redis中文网的翻译介绍.

Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能

基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。

消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)

消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,因此subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。三.redis pub sub(publish subscribe)之基本使用

下面我将配着实图(用我的本地机器环境)来为大家讲解redis的pub/sub怎么去使用 .

没有安装phpredis扩展的或者没有redis服务的,请参考我的 另一篇blog ,有详细的安装介绍,这里不再赘述了。

1、启动redis服务端

DSC0000.jpg (74.7 KB, 下载次数: 39)

2017-12-22 07:35 上传

2、启动redis客户端,并做为subscribe订阅端

新开一个终端,启动redis客户端,并做为subscribe客户端(消息订阅者),订阅一个名字叫test的频道信息:

DSC0001.jpg (55.64 KB, 下载次数: 40)

2017-12-22 07:35 上传

3、启动redis客户端,并做为publish客户端

发布一个名字叫test的频道,信息是:hello,world

DSC0002.jpg (41.91 KB, 下载次数: 36)

2017-12-22 07:35 上传

4、查看订阅到的消息

再切换到2步骤中的redis客户端窗口,会发现,已经订阅到了刚才发布的 'hello,world'消息:

DSC0003.jpg (64.59 KB, 下载次数: 36)

2017-12-22 07:35 上传

其中,test为频道名称,hello,world即为消息

5、模式匹配订阅

Redis 的Pub/Sub实现支持模式匹配。

客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息。 比如,将接收所有发到 test.name,test.phone,test.address...等等的消息,该这样写:

PUBSCRIBE test.*

在终端回车后,同时再新的窗口里分别发布两个频道的消息,名字分别为:test.name和test.phone,然后切换到订阅端的窗口里,结果如下图所示:

DSC0004.jpg (82.85 KB, 下载次数: 37)

2017-12-22 07:35 上传

由上图可以看出,在订阅了test.*频道后,一共收到了 test.name和test.phone两个频道的消息,这就是模式匹配订阅。

那么取消订阅匹配该模式的客户端也比较简单:

PUNSUBSCRIBE test.*

好,以上的这些简单的demo,就是关于redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)的最基本使用。说了这么多,跟php也没有挂上什么钩,别着急,重要的都往往最后出场。

四.php redis pub/sub

phpredis的安装

redis的客户端连接支持多种语言。这里我用的是php的phpredis,它是用c语言编写的,目前已经作为php的一个模块扩展,没有安装的可以参考我的 另一篇blog ,已经安装的可以忽略此步骤.

命令手册

详细请看github 这里 。 这里我列出一些常用的:

Redis::__construct构造函数

$redis = new Redis();

connect, open 链接redis服务

参数

host: string,服务地址

port: int,端口号

timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间)

注: 在redis.conf中也有时间,默认为300

pconnect, popen 不会主动关闭的链接

参考上面

setOption 设置redis模式

getOption 查看redis设置的模式

ping 查看连接状态

get 得到某个key的值(string值)

如果该key不存在,return false

set 写入key 和 value(string值)

如果写入成功,return ture

setex 带生存时间的写入值

$redis->setex('key', 3600, 'value'); // sets key → value, with 1h TTL.

setnx 判断是否重复的,写入值

$redis->setnx('key', 'value');

$redis->setnx('key', 'value');

delete 删除指定key的值

返回已经删除key的个数(长整数)

$redis->delete('key1', 'key2');

$redis->delete(array('key3', 'key4', 'key5'));

更详细的使用请参考这里 ,我就不写太多,因为我要直接摞代码了.

publish(消息发布端):pub.php

/**  * redis sub(消息订阅端)

* @ blog: phping.sinaapp.com

* @date 2016-04-24 15:00

*/

$redis = new Redis();

// 第一个参数为redis服务器的ip,第二个为端口

$res = $redis->connect('127.0.0.1', 6379);

// test为发布的频道名称,hello,world为发布的消息

$res = $redis->publish('test','hello,world');

subscribe(消息订阅端): sub.php

/**  * redis sub(消息订阅端)

* @ blog: phping.sinaapp.com

* @date 2016-04-24 15:00

*/

$redis = new Redis();

$res = $redis->pconnect('127.0.0.1', 6379,0);

$redis->subscribe(array('test'), 'callback');

// 回调函数,这里写处理逻辑

function callback($instance, $channelName, $message) {

echo $channelName, "==>", $message,PHP_EOL;

}

开始订阅redis消息

前面已经提到过,消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息,所以我们用命令行来执行:

php启动redis订阅端

则 订阅消息的redis客户端已经启动,随时等待发布过来的消息并订阅该消息. 发布redis消息 同样,命令行执行消息发布端的脚本即可:

php pub.php

切换到消息订阅端的窗口

发现终端有输出,如下图

DSC0005.jpg (21.7 KB, 下载次数: 39)

2017-12-22 07:35 上传

哈哈,是不是 收到了发布端发布的'hello,world'这条消息呢。

php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用相关推荐

  1. RabbitMQ工作模式Publish/Subscribe发布订阅,test测试代码

    RabbitMQ有以下几种工作模式 : 1.Work queues  工作队列 2.Publish/Subscribe 发布订阅 3.Routing      路由 4.Topics        通 ...

  2. 译: 3. RabbitMQ Spring AMQP 之 Publish/Subscribe 发布和订阅

    在第一篇教程中,我们展示了如何使用start.spring.io来利用Spring Initializr创建一个具有RabbitMQ starter dependency的项目来创建spring-am ...

  3. Redis第二话 -- Redis的高端操作(发布订阅、事务、LUA脚本)

    在Redis中还有一些用法是我们在工作中用的比较少的,本文统一整理一下. 1.发布订阅 在Redis里面除了List的阻塞队列可以实现消息队列以外,还有一种消息通信模式:发送者 (pub) 发送消息, ...

  4. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

  5. Publish/Subscribe 发布与订阅模式

    Publish/Subscribe 发布与订阅: 通过交换机来实现,一个生产者可以让不同队列的消费者同时得到消息 生产者: package Fanout; import com.rabbitmq.cl ...

  6. java redis mq_redis之mq实现发布订阅模式

    概述 Redis不仅可作为缓存服务器,还可用作消息队列,本示例演示如何使用redis实现发布/订阅消息队列. 在Redis中,发布者没有将消息发送给特定订阅者的程序.相反,发布的消息被描述为通道,而不 ...

  7. redis 发布订阅实际案例_Redis源码分析之发布订阅+慢查询+排序以及监视器

    发布订阅 发布订阅就是一个经典的观察者模式,其中通道是指channel字符串本身,而模式是指正则表达式,进行匹配.结合Redis设计与实现一书 数据结构 基本数据结构 在client对象中,分别记录了 ...

  8. mqtt session保持 订阅消息_如何使用 MQTT 报文实现发布订阅功能

    MQTT 协议通过交换预定义的MQTT控制报文来通信.下面以 Connect 连接 MQTT 协议基于 TCP/IP 协议,MQTT Broker 和 Client 都有需要有 TCP/IP 地址. ...

  9. c#事件的发布-订阅模型_C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命...

    使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...

最新文章

  1. ubantu中的mysql命令
  2. 一篇论文摘要计算机英语,推荐:计算机毕业论文英文摘要的写作方法
  3. m 文件 dll matlab 中调用_Java与MatLab混编
  4. 使用tf.print()打印tensor内容
  5. java继承总结_java继承总结(二)
  6. DIY Roomba Virtual Wall
  7. qt如何提前jpg文件里的缩略图_如何去捕获和编辑H5制作软件Hype中的海报图像
  8. 关于在unity中动态获取字符串后在InputField上进行判断的BUG
  9. cacti无密码登录
  10. 解决WORD无法多次编辑保存
  11. java连接数据库的5种方式
  12. MSN网盘SkyDrive
  13. 图片验证码获取及验证
  14. Python.习题六 字典与集合(下)
  15. uniapp路由守卫
  16. idea svn插件离线安装_idea离线安装lombock插件
  17. 【Python数据挖掘】用朴素贝叶斯预测人类活动识别
  18. Net-snmp添加子代理示例
  19. 一张表格搞懂那些特殊的IP地址
  20. Appium: Could not proxy command to the remote server. Original error: socket hang up

热门文章

  1. 前端学习(338):堆栈
  2. java学习(154):文件复制
  3. 树莓派静态IP配置方法
  4. Webpack基础之插件
  5. 怎样下载安装python_Windows系统上如何安装Python和pip
  6. MPP install
  7. 记一次webpack4+react+antd项目优化打包文件体积的过程
  8. STM32 软件模拟 IIC 代码,标准库、HAL库可用
  9. 编译原理预测分析程序
  10. 被引用的外部JS存在window.onload时,判断当前页面是否已存在window.onload,并进行相应处理...