Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 操作系统

  • 计算机网络

  • 数据结构和算法

  • MySQL

  • Redis

    • Redis持久化和数据数据恢复
    • Redis发布订阅
      • PHP实践
      • 应用场景
      • 参考文档
    • Redis管道技术
    • Redis事务机制
    • Redis数据过期和淘汰策略
    • Redis中BitMap使用
    • Redis中lua脚本使用
    • Redis通信协议(RESP)入门
    • Redis性能测试Redis-benchmark
    • Redis主从模式搭建及应用
    • Redis集群及高可用实现
    • Redis和Memcache对比
    • Redis缓存穿透、缓存击穿、缓存雪崩
    • Redis万字总结
    • 如此简单:Redis安装
    • Memcached安装部署
  • Nginx

  • MongoDB

  • 其他

  • 计算机基础
  • Redis
Ravior
2017-12-22
目录

Redis发布订阅

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis客户端可以订阅任意数量的频道,下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

Redis发布订阅

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

Redis发布订阅

一个Redis client发布消息,其他多个redis client订阅消息,发布的消息“即发即失”,Redis不会持久保存发布的消息,消息订阅者也将只能得到订阅之后的消息,通道中此前的消息将无从获得。

消息发布者,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作。

消息订阅者,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;因此这里subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。

TCP默认连接时间固定,如果在这时间内sub端没有接收到pub端消息,或pub端没有消息产生,sub端的连接都会被强制回收。

# PHP实践

发布者:

<?php

// Redis发布订阅-发布者

require '../common.php';

$redis = new Redis();

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

$i = 0;
while($i < 1000) {
	print_log('send msg: '.'msg ' .$i);
	$redis->publish('msg','msg ' .$i);
	$i++;
	sleep(1);
}

$redis->close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

订阅者:

<?php

// Redis发布订阅-订阅者

require '../common.php';

$redis = new Redis();

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


$redis->subscribe(['msg'], 'callback');

function callback($instance,$channelName,$message)
{
	print_log('收到频道[ '.$channelName.' ]的消息:'.$message);
}

## 输出
21:53:05 收到频道[ msg ]的消息:msg 248
21:53:06 收到频道[ msg ]的消息:msg 249
21:53:07 收到频道[ msg ]的消息:msg 250
21:53:08 收到频道[ msg ]的消息:msg 251
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 应用场景

Redis利用发布订阅可以作为简单的消息队列来用,但是和专业的MQ中间件(RabbitMQ\Kafka)比较的话,没有持久化(可以用list替代)和ACK确认机制,适合于消息投递率要求不高的场景,例如:

  • 短信发送、日志发送等功能解耦场景;
  • 构建实时消息系统,比如普通的即时聊天,群聊等功能;

# 参考文档

  • 订阅与发布 (opens new window)
#Redis
上次更新: 2022/12/01, 11:09:34
Redis持久化和数据数据恢复
Redis管道技术

← Redis持久化和数据数据恢复 Redis管道技术→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式