`
DiaoCow
  • 浏览: 244361 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

《Redis源码学习笔记》发布/订阅

阅读更多
《Redis源码学习笔记》文章列表

Redis的SUBSCRIBE命令,可以让客户端订阅任意数量的频道,每当有新消息发送到某个频道时,Redis就会把这消息发送给所有订阅该频道的客户端;如下图:客户端Client_1,Client_2,Client_3都订阅了频道channel,当有消息PUBLISH到频道channel时,这三个客户端都将收到消息:



原理:RedisServer内部维护了一个pubsub_channels字典,其中字典的键就是被订阅的频道,而键值就是订阅该频道的客户端列表;



这样,当一个客户端执行PUBLISH channel_name命令时,Redis就可以根据channel_name在pubsub_channels中找到与其关联的客户端列表,然后把消息发送给它们,伪代码;
def publishCommand(channel, msg):
	# 获取订阅channel的所有客户端列表
    client_list = redisServer.pubsub_channels.get(channel)
    if client_list is None: return
    # 向每个客户端发送消息
    for client in client_list:
        client.sendMessage(msg)

另外,客户端自己也维护了一个pubsub_channels属性,用来记录自己订阅了哪些频道;同watched_keys属性一样(详情请参看 事务章节),客户端维护这些也是出于效率考虑的:

a. 防止订阅相同的频道;
def subscribeCommand(client, channels):
    for ch in channels:
    	# 如果已经订阅了该频道,则跳过
        if ch  in client.pubsub_channels: continue
        # 把client添加到该频道关联的客户端列表
        client_list = redisServer.pubsub_channels.get(ch)
        client_list.add(client) 
        client.pubsub_channels.add(ch)

b. 在UNSUBSCRIBE时,可以快捷的取消该客户端订阅的所有频道,而无需遍历整个redisServer.pubsub_channels字典,伪代码:
def unsubscribeCommand(client):
	# 获取client订阅的所有频道
    channels = client.pubsub_channels
    # 遍历频道
    for ch in channels:
        client_list = redisServer.pubsub_channels(ch)  
        # 从该频道关联的客户端列表中,删除client
        client_list.del(client)
        client.pubsub_channels.del(ch)


考虑这么一个需求:有两个频道,名字都以“hello_开头”,分别叫做hello_1, hello_2;当我们要订阅这类频道时,我们可能会这么写:SUBSCRIBE hello_1 hello_2,但是如果有100个难道要这样写 SUBSCRIBE hello_1 hello_2 ... hello_100? 这时候我们可以使用“模式订阅”命令PSUBSCRIBE, 譬如这里我们就可以写成,PSUBSCRIBE hello_* ;这样,当一个客户端执行PUBLISH命令时,redis不仅会把消息发送给所有订阅该频道的客户端列表,同时也会把该频道与所有模式匹配,如果匹配成功,则把消息同样发送给订阅该模式的客户端列表:



所以完整的PUBLISH命令伪代码如下:
def publishCommand(channel, msg):
	# 获取订阅channel的所有客户端列表
    client_list = redisServer.pubsub_channels.get(channel)
    if client_list is None: return
    # 向每个客户端发送消息
    for client in client_list:
        client.sendMessage(msg)

    # 遍历pubsub_patterns
    for pattern, client in redisServer.pubsub_patterns:
    	# 若模式与channel匹配,则把消息发送给订阅该模式的客户端
    	if pattern.match(channel):
    		 client.sendMessage(msg)

更多细节请看:pubsub.c/publishCommand函数

总结:
1. 熟悉发布订阅相关命令:subscribe/unsubscribe psubscribe/punsubscribe publish;
2. 了解发布订阅实现原理;

  • 大小: 3.8 KB
  • 大小: 4.3 KB
  • 大小: 7.8 KB
分享到:
评论

相关推荐

    Redis全套学习笔记

    它支持多种数据结构,包括字符串(String)、链表(List)、哈希(Hash)、集合(Set)和有序集合(Zset),这些丰富的数据结构使得Redis在缓存、计数、发布订阅系统等多种场景下表现出色。 1. Redis 概述与安装: Redis ...

    狂神redis源码笔记.rar

    在“狂神redis源码笔记”中,我们可以期待学习到Redis的源码分析、内部机制以及如何通过Java进行高效操作。源码分析是深入理解Redis工作原理的关键,有助于开发者优化使用方式或进行定制化开发。 Redis的核心知识点...

    redis入门学习笔记

    Redis是一个开源的、基于内存的数据...总的来说,Redis入门学习笔记详细介绍了Redis的特性、安装、数据类型、使用场景、备份与恢复、性能测试、Python客户端使用等基础知识和技巧,非常适合新手作为入门学习的资料。

    Redis学习笔记整理

    ### Redis学习笔记整理 #### 一、Redis环境搭建 ##### 1.1 简介 Redis是一款开源的键值(Key-Value)型数据库系统,因其高性能和丰富的数据结构而广受欢迎。它不仅可以作为数据库使用,还可以作为一种数据结构服务器...

    redis学习笔记.pdf

    Redis学习笔记 Redis是一个开源的基于键值对(Key-Value)NoSQL数据库,使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API。Redis可以被称为KV数据库,键值对数据库,内部存储...

    Redis学习笔记

    本学习笔记将基于提供的压缩包文件,深入探讨Redis的关键特性、工作原理以及常见应用场景。 首先,"深入redis学习(一)--readme and conf.doc"介绍了Redis的安装和配置过程。在配置文件中,我们可以设置服务器的...

    一份精简的redis入门学习笔记

    Redis 是一款高性能的键值数据库,...在学习 Redis 时,了解其数据类型、操作命令、持久化机制以及复制和发布订阅等功能是至关重要的。通过不断实践和探索,可以深入掌握 Redis 的精髓,并将其有效地应用到实际项目中。

    Redis的学习笔记

    发布订阅(Publish/Subscribe)功能实现了消息通信,使得不同客户端之间可以异步传递信息。 持久化方面,Redis 提供了 RDB(快照)和 AOF(Append Only File)两种方式。RDB 在指定时间间隔生成数据库的快照,而 ...

    燕十八redis视频教程笔记资料

    首先,从官方网站下载最新稳定版的Redis源码或二进制包。在Linux环境下,可以使用编译源码的方式进行安装,涉及到`make`和`make install`等命令。对于Windows用户,可直接下载预编译的二进制包,解压后配置环境变量...

    Redis学习笔记1

    本文将基于提供的“Redis学习笔记1”内容,详细介绍Redis的安装、启动、单线程特性、发布订阅机制、持久化策略以及AOF和RDB的区别。 1. **Redis安装与启动** Redis的安装通常涉及下载源码包、解压、编译和安装。在...

    redis学习笔记

    ### Redis学习笔记知识点详解 #### 一、Redis环境搭建 **1.1 Redis简介** Redis是一种高性能的键值存储系统,常被用作数据库、缓存以及消息中间件。其最大的特点是支持多种数据结构,如字符串(String)、列表...

    redis学习笔记,redis详解,Java源码.zip

    Redis是一款高性能的键值对数据库,它以内存存储为主,数据持久...通过阅读本学习笔记和源码分析,你可以深入了解Redis的工作原理,掌握如何在实际项目中高效地使用Redis。不断实践和探索,你将成为Redis的熟练驾驭者。

    2022年redis学习笔记

    这份2022年的Redis学习笔记涵盖了Redis的基础概念、核心特性、使用场景以及最佳实践。 一、Redis简介 Redis是一个开源(BSD许可)的,非关系型、内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它...

    Redis.zip学习笔记

    在"Redis.zip学习笔记"中,我们可以预期包含以下几个主要的知识点: 1. Redis简介:Redis是一个开源(BSD许可),内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、...

    Redis全面深入学习笔记(强烈推荐).docx

    在深入学习Redis时,还需要掌握更多高级特性,如持久化(RDB和AOF)、事务、发布订阅、主从复制、哨兵系统和Cluster集群等。理解这些特性将有助于在实际应用中更好地利用Redis的优势。此外,了解Redis的数据结构(如...

    redis学习笔记详细整理手册

    五、Redis事务与发布订阅 1. 事务(Transactions):Redis支持简单的事务功能,通过`MULTI`、`EXEC`命令实现多条命令的原子执行。 2. 发布订阅(Publish/Subscribe):允许客户端订阅特定频道,服务器在发布消息时将...

    redis初级入门笔记

    Redis 的发布订阅功能允许客户端订阅感兴趣的主题,当有其他客户端向该主题发布消息时,订阅者会收到通知。 **8. 路由与集群** Redis Cluster 是 Redis 的分布式解决方案,它可以将数据分散在多个节点上,自动处理...

Global site tag (gtag.js) - Google Analytics