程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 缓存数据库 - Redis

    • Redis - 介绍
    • Redis - 安装
    • Redis - 五大数据类型及API
    • Redis - 新增三大数据类型
    • Redis - 配置文件
    • Redis - 发布和订阅
      • 1. 什么是发布和订阅
      • 2. 简介
      • 3. 指令与描述
      • 4. 指令测试
        • 订阅消息
        • 发布消息
        • 接收消息
        • 原理
    • Redis - Java整合
    • Redis - 事务与锁
    • Redis - 两种持久化
    • Redis - 主从复制
    • Redis - 集群搭建
    • Redis - 缓存问题
    • Redis - 分布式锁
    • Redis - Spring Data Redis
  • 数据库
  • 缓存数据库 - Redis
scholar
2021-12-26
目录

Redis - 发布和订阅

笔记

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

  • 1. 什么是发布和订阅
  • 2. 简介
  • 3. 指令与描述
  • 4. 指令测试
    • 订阅消息
    • 发布消息
    • 接收消息
    • 原理

# 1. 什么是发布和订阅

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

Redis 客户端可以订阅任意数量的频道。

# 2. 简介

订阅/发布消息图:

image-20210409105838259

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

image-20210409105859670

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

image-20210409110314032

# 3. 指令与描述

下表列出了 Redis 发布订阅常用命令:

序号 命令 描述
1 PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道
2 PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态
3 PUBLISH channel message 将信息发送到指定的频道
4 PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道
5 SUBSCRIBE channel [channel ...] 订阅给定的一个或多个频道的信息
6 UNSUBSCRIBE [channel [channel ...]] 指退订给定的频道

大小写都可以。

# 4. 指令测试

Redis的发布订阅模式是一种消息通信模式,允许发送者(发布者)将消息发送到Redis频道,而接收者(订阅者)则可以订阅这些频道来接收消息。这个过程是通过两组命令实现的:SUBSCRIBE/UNSUBSCRIBE用于订阅和取消订阅频道,而PUBLISH用于向频道发布消息。这种模式支持一对多的消息广播,即一个消息可以被多个订阅者接收。

# 订阅消息

  • 打开第一个redis-cli客户端,使用SUBSCRIBE命令订阅一个名为redisChat的频道。执行此命令后,客户端进入订阅状态,开始等待接收通过redisChat频道发送的消息。

    redis 127.0.0.1:6379> SUBSCRIBE redisChat
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "redisChat"
    3) (integer) 1
    
    1
    2
    3
    4
    5

    这里的输出表示客户端已成功订阅redisChat频道,并且当前该频道有1个订阅者。

# 发布消息

  • 在第二个redis-cli客户端,使用PUBLISH命令向redisChat频道发布消息。每执行一次PUBLISH命令,所有订阅该频道的客户端就会收到消息。

    redis 127.0.0.1:6379> PUBLISH redisChat "Hello,Redis"
    (integer) 1
    redis 127.0.0.1:6379> PUBLISH redisChat "Hello,java"
    (integer) 1
    
    1
    2
    3
    4

    这里的(integer) 1表示消息成功发送给了1个订阅者。

# 接收消息

  • 第一个客户端,作为订阅者,会显示它接收到的消息内容。每当有新消息通过redisChat频道发布时,订阅该频道的客户端会自动接收并显示这些消息。

    1) "message"
    2) "redisChat"
    3) "Hello,Redis"
    4) "message"
    5) "redisChat"
    6) "Hello,java"
    
    1
    2
    3
    4
    5
    6

    对于每条接收到的消息,输出格式为一个包含消息类型("message")、频道名称("redisChat")、以及消息内容的列表。

总结

总结来说,Redis的发布订阅功能提供了一种简单高效的消息广播机制,通过SUBSCRIBE命令订阅频道接收消息,通过PUBLISH命令向频道发送消息,实现了发布者和订阅者之间的解耦。这种机制在需要消息通知、实时消息传递等场景下非常有用。

# 原理

Redis 是使用 C 实现的,通过分析 Redis 源码里的 pubsub.c 文件,了解发布和订阅机制的底层实现,来加深对 Redis 的理解。

Redis 通过 PUBLISH、SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能。

通过 SUBSCRIBE 命令订阅某频道后,redis-server 里维护了一个字典,字典的键就是一个个 channel,而字典的值则是一个链表,链表中保存了所有订阅这个 channel 的客户端。SUBSCRIBE 命令的关键,就是将客户端添加到给定 channel 的订阅链表中。

通过 PUBLISH 命令向订阅者发送消息,redis-server 会使用给定的频道作为键,在它所维护的 channel 字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。

Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在 Redis 中,你可以设定对某一个 key 值进行消息发布及消息订阅,当一个 key 值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

使用场景:Redis 的 Pub/Sub 系统可以构建实时的消息系统,比如很多用 Pub/Sub 构建的实时聊天系统的例子。

注意:发布的消息没有持久化,如果在订阅的客户端收不到 hello,只能收到订阅后发布的消息。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Redis - 配置文件
Redis - Java整合

← Redis - 配置文件 Redis - Java整合→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式