写在前面
Redis 是完全开源的,高性能的 key-value 数据库,受到越来越多的业务场景应用。对于"发布/订阅"的消息模式,大家也许都比较了解,但是其实现原理及应用是否还存在模糊呢?
今天计划同大家一起,深入浅出讲透 Redis 发布订阅,尽量通俗易懂,让大家轻松上手。
发布/订阅模式
关于发布/订阅模式
在软件架构中,发布/订阅是一种消息模式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者),而是通过消息通道广播出去,让订阅该消息主题的订阅者消费到。
Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分:发布者(Publisher),订阅者(Subscriber)和频道(Channel)。发布/订阅者模式最大的特点就是实现了松耦合。
Redis发布订阅分类
-
频道的发布订阅
-
模式的发布订阅
下面来分别详细阐述一下其实现原理及应用。
频道的发布订阅
实现原理
Redis将所有频道的订阅关系都保存在服务器状态的 pubsub_channels 字典,字典的键是某个被订阅的频道,而对应值则是一个链表,链表里记录了所有订阅这个频道的客户端。
struct redisServer{
//...
// 保存所有频道订阅关系
dict *pubsub_channels;
//...
}
一个pubsub_channels字典示例如下:
-
client-1、client-2、client-3 三个客户端正在订阅 “article.tech” 频道
-
客户端 client-4 正在订阅 “article.mysql” 频道
-
client-5、client-6 两个客户端正在订阅 “article.redis” 频道
订阅频道
相关命令:
SUBSCRIBE channel [channel …]
当客户端执行SUBSCRIBE命令订阅某个或某些频道的时候,这个客户端与被订阅频道之间就建立起了一种订阅关系。
建立订阅关系执行分两种情况:
1)该