redis通过发布与订阅实现消息队列

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/raoxiaoya/article/details/100512687

相比于kafka,rabbitMQ,redis的消息队列是一款轻量级的实现,消息不会存储与补发,只能用在不重要的信息上。

六个函数

1、发布端
publish			将信息发送到指定的频道
pubsub			查看订阅与发布系统状态
	pubsub channels [pattern] 列出当前的活跃频道
	pubsub numsub test 返回给定频道的订阅者数量, 订阅模式的客户端不计算在内
	pubsub numpat 返回订阅模式的数量

2、订阅端
subscribe		订阅给定的一个或多个频道的信息 subscribe test_name test_phone
unsubscribe 	退订给定的频道 unsubscribe test_name
psubscribe 		订阅一个或多个符合给定模式的频道 psubscribe  test_*
punsubscribe	退订所有给定模式的频道 punsubscribe test_*

1、基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。
2、消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)
3、消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,因此subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。连接断开表示立即退订。
4、channel只接收publish发送的消息,自身不存储消息,如果channel没有被订阅,则消息丢弃。

使用场景
由于订阅者需要保持着长链接,所以不太适合做大量用户实时聊天通讯,毕竟有更好的方案。
一般会用在系统间的消息传递,指令发送,上下游的同步。

指标:
redis单机可支持2w-3w的同时连接
查看当前同时在线连接数

> info
	# Clients
	connected_clients:2
	client_longest_output_list:0
	client_biggest_input_buf:0
	blocked_clients:0

设置最大连接数

vi /usr/local/redis/redis.conf
maxclients 25000

根据phpredis提示pconnect将不再支持不中断的连接
在这里插入图片描述
实际使用也是这样的,pconnect过不了多久就会中断了。

发布端

<?php
/**
 * ----------------------------------------------------------
 * date: 2019/9/3 8:25
 * ----------------------------------------------------------
 * author: Raoxiaoya
 * ----------------------------------------------------------
 * describe: 发布消息
 * ----------------------------------------------------------
 */

$channel = 'test';

try {

    $redis = new \Redis();
    $redis->connect('127.0.0.1', 6379);
    // 发布消息,非阻塞的
    $redis->publish($channel, 'msg1');

} catch (Exception $e) {
    echo $e->getMessage();
}

订阅端

<?php
/**
 * ----------------------------------------------------------
 * date: 2019/9/3 8:25
 * ----------------------------------------------------------
 * author: Raoxiaoya
 * ----------------------------------------------------------
 * describe: 订阅消息
 * ----------------------------------------------------------
 */

// 时间设置,否则连接会中断
set_time_limit(0);
ini_set('default_socket_timeout', -1);

$channels = ['test'];

try{

    $redis = new \Redis();
    $redis->pconnect('127.0.0.1', 6379);
    // 阻塞等待消息
    $redis->subscribe($channels, function($redis, $chan, $msg){
        var_dump($redis);
        var_dump($chan);
        var_dump($msg);
    });

    // 订阅指定匹配模式
    // $redis->psubscribe(['test'], function($redis, $pattern, $chan, $msg){
    //     var_dump($redis);
    //     var_dump($pattern);
    //     var_dump($chan);
    //     var_dump($msg);
    // });

}catch(Exception $e){
    echo $e->getMessage();
}

猜你喜欢

转载自blog.csdn.net/raoxiaoya/article/details/100512687