万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • Redis

    • Redis简介
    • 缓存的认识
    • Linux安装Redis的正确方式
    • Redis数据类型
    • Redis底层数据结构
    • Redis回收策略与缓存过期
    • Redis持久化
    • Redis发布与订阅
      • 发布与订阅指令
      • 发布订阅的机制
      • 使用场景
    • Redis事务
    • Redis Lua脚本
    • Redis 慢查询
    • Redis 监视器
    • Redis通讯协议
    • Redis事件处理机制与NIO演进
    • Redis 常用命令
    • Redis与MyBatis整合
    • Spring、SpringBoot整合Redis
  • 集群架构

  • Redis
  • Redis
2022-03-30
目录

Redis发布与订阅

# Redis发布与订阅

Redis 发布/订阅(Pub/Sub) (opens new window)

Redis提供了发布订阅功能,可以用于消息的传输。

Redis的发布订阅机制包括三个部分:publisher(发布者),subscriber(订阅者)和channel(频道)。

发布者订阅者都是Redis客户端,Channel则为Redis服务器端。发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。

pubsub

# 发布与订阅指令

详细指令看:help @pubsub

subscribe订阅指令:subscribe channel [channel ...]

# 客户端1订阅ch1、ch2频道
127.0.0.1:6379> subscribe ch1 ch2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
1) "subscribe"
2) "ch2"
3) (integer) 2

publish发布消息指令: publish channel message

# 客户端2将消息发布在ch1、ch2上
127.0.0.1:6379> publish ch1 hello
(integer) 1
127.0.0.1:6379> publish ch2 world
(integer) 1

# 客户端2收到ch1、ch2频道的消息
1) "message"
2) "ch1"
3) "hello"
1) "message"
2) "ch2"
3) "world"

unsubscribe退订指令:unsubscribe [channel [channel ...]]

# 客户端1退订ch1频道
127.0.0.1:6379> unsubscribe ch1
1) "unsubscribe"
2) "ch1"
3) (integer) 0

psubscribe 模式匹配订阅: psubscribe [pattern [pattern ...]]

# 客户端1订阅所有以ch开头的频道
127.0.0.1:6379> psubscribe ch*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "ch*"
3) (integer) 1

# 客户端2消息发布到频道3
127.0.0.1:6379> publish ch3 hello3
(integer) 1
# 客户端1收到符合ch*频道的消息
1) "pmessage"
2) "ch*"
3) "ch3"
4) "hello3"

punsubscribe 模式匹配退订: punsubscribe [pattern [pattern ...]]

127.0.0.1:6379> punsubscribe ch*
1) "punsubscribe"
2) "ch*"
3) (integer) 0

# 发布订阅的机制

Redis客户端与服务端数据额结构体定义:

typedef struct redisClient { 
  ... 
  // 该client订阅的所有channels,以channel为key用dict的方式组织 
  dict *pubsub_channels; 
  // 该client订阅的pattern,以list的方式组织 
  list *pubsub_patterns; 
  ... 
} redisClient; 

struct redisServer { 
  ... 
  // redis server进程中维护的channel dict,它以channel为key,订阅channel的client list为value 
  // 即该服务器端中的所有频道以及订阅了这个频道的客户端
  dict *pubsub_channels;
  // redis server进程中维护的pattern list int notify_keyspace_events
  // 即该服务器端中的所有模式和订阅了这些模式的客户端
  list *pubsub_patterns; 
  ... 
};

当客户端向某个频道发送消息时,Redis首先在redisServer中的pubsub_channels中找出键为该频道的结点,遍历该结点的值,即遍历订阅了该频道的所有客户端,将消息发送给这些客户端。

然后,遍历结构体redisServer中的pubsub_patterns,找出包含该频道的模式的结点,将消息发送给订阅了该模式的客户端。

# 使用场景

  • Redis哨兵模式:在Reids模式中,哨兵通过发布与订阅的方式与Redis主服务器和Redis从服务器进行通信。
  • Redisson框架:Redisson是一个分布式锁框架,在Redisson分布式锁释放的时候,是使用发布与订阅的方式通知的。
上次更新: 5/30/2023, 11:42:20 PM
Redis事务

Redis事务→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式