相比于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();
}