redis 发布订阅(pub/sub)是一种信息通信模式。发送者(pub)发送消息,订阅者(sub)接收消息。
redis订阅频道(channel)
需要先订阅频道,再向频道发送消息。
redis 发布订阅的原理:
通过 subscribe 命令订阅频道后,redis-server 中将维护一个字典,字典的键是频道名,值是一个链表,链表中保存了所有订阅了该频道的客户端(subscribe 命令就是将客户端添加到指定频道的链表中)。
订阅频道命令
subscribe <channel> ... #订阅频道 ,一旦客户端进入订阅状态,客户端就只可接受订阅相关的命令:
#SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE
#除了这些命令,其他命令一律失效。
通过 publish 命令发送信息,redis-server 会使用指定的频道为键,在自身维护的字典中查找频道链表中的所有客户端,遍历链表将消息发布给订阅者。
发布命令
publish <channel> <message> #将信息 message 发送到指定的频道 channel
#返回值为接收到消息的客户端数量
redis订阅模式(pattern)
在这里引用图片以便更好的理解订阅模式
模式匹配了两个频道,当其中一个频道接收到了发布者发送的消息,这个频道的所有订阅客户端都会收到消息,且订阅了模式的所有客户端也会收到消息。
订阅模式命令:
psubscribe <pattern> ... #订阅指定的模式pattern:pattern参数可以使用匹配符
#h?llo 模式可以匹配到hello、hallo、hxllo等频道
#h*llo 模式可以匹配到hllo、heeeello等频道
#h[ae]llo 模式可以匹配到hello和hallo频道,但是匹配不到hxllo频道
退订
退订频道命令:
unsubscribe <channel> ... #退订指定的频道,如果没有指定频道参数,则退订所有的频道
退订模式命令:
unpsubscribe <pattern> ... #退订指定的模式,如果没有指定模式参数,则退订所有的模式
退出redis-cli客户端会自动退订。
自省(监测状态)
查看活跃的频道:
pubsub channels <pattern> #获取至少有一个订阅者的频道,
#pattern参数为空则列出所有活跃频道,参数有值时只列出与模式匹配的活跃频道
查看指定频道的订阅者数量:
pubsub numsub <channel> ... #依次获取指定频道的订阅者数量(不包含订阅模式的订阅者)
查看客户端订阅的模式数量:
pubsub numpat #返回订阅模式的数量
redis发布订阅应用场景
1、实时信息系统(网站的公告)
2、实时聊天(将频道当做聊天室)
3、用户的订阅和关注