redis设计与实现读书笔记——发布与订阅

MTK平台TP驱动设备树与GPIO配置实战解析 本文详细解析了MTK平台TP驱动开发中的设备树与GPIO配置实战。通过DCT工具配置GPIO引脚,结合设备树节点定义触摸参数,并分享驱动移植、编译调试技巧及常见问题解决方案,帮助开发者快速掌握MTK触摸驱动开发核心。 阅读详情

频道的订阅与退订

Redis将所有频道的订阅关系都保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,而键的值则是一个链表,链表里面记录了所有订阅这个频道的客户端。

struct redisServer{
    //……

    //保存所有频道的订阅关系
    dict *pubsub_channels;

    //……
};

  • 订阅频道

每当客户端执行SUBSCRIBE命令订阅某个或某些频道的时候,服务器都会将客户端与被订阅频道在pubsub_channels字典中进行关联。

def subscribe(*all_input_channels)

    #遍历输入的所有频道
    for channel in all_input_channels;

        #如果channel不存在于pubsub_channels字典,则在字典中添加该键,并设置它的值为空链表
        if channel not in server.pubsub_channels:
            server.pubsub_channels[channel]=[]

        #将订阅者添加到频道所对应的链表的末尾
        server.pubsub_channels[channel].append(client)
  • 退订频道

UNSUBSCRIBE命令的行为和SUBSCRIBE命令的行为正好相反,当一个客户端退订某个或某些频道的时候,服务器将从pubsub_channels中解除客户端与被退订频道之间的关联。

def unsubscribe(*all_input_channels)

    #遍历要退订的的所有频道
    for channel in all_input_channels;

        #在订阅者链表中删除退订的客户端
        server.pubsub_channels[channel].remove(client)

        #如果频道中已经没有任何订阅者了,那么将频道从字典中删除
        if len(server.pubsub_channels[channel]) == 0:
            server.pubsub_channels.remove(channel)

       

模式的订阅与退订

Redis将所有模式的订阅关系都保存在服务器状态的pubsub_patterns属性里面

struct redisServer{
    //……

    //保存所有模式的订阅关系
    list *pubsub_patterns;

    //……
};

  • 订阅模式
def psubscribe(*all_input_patterns)

    #遍历输入的所有模式
    for pattern in all_input_patterns;

        #创建新的pubsubPattern结构,记录被订阅的模式,以及订阅模式的客户端
        pubsubPattern = create_new_pubsubPattern()
        pubsubPattern.client = client
        pubsubPattern.pattern = pattern

        #将新的pubsubPattern追加到pubsub_patterns链表末尾
        server.pubsub_patterns.append(pubsubPattern)
  • 退订模式
def punsubscribe(*all_input_patterns)

    #遍历所有要退订的模式
    for pattern in all_input_patterns;

        #遍历subpub_patterns链表中的所有pubsubPattern结构
        for pubsubPattern in server.pubsub_patterns:

        #如果当前客户端与subpubPattern记录的客户端相同
        #并且退订的模式也和pubsubPattern记录的模式相同
        if client == pubsubPattern.clent and pattern = pubsubPattern.pattern

            #将这个pubsubPattern删除
            server.pubsub_patterns.remove(pubsubPattern)

发送消息

当一个Redis客户端执行PUBLISH <channel> <message>命令将消息message发送给频道channel的时候,服务器需要执行以下两个动作:

  1. 将消息message发给channel频道的所有订阅者
  2. 如果有一个或者多个模式pattern与频道channel相匹配,那么将消息message发送给pattern模式的订阅者
def channel_publish(channel,message)

    #如果模式不存在于pubsub_channels字典中,直接返回
    if channel not in server.pubsub_channels
        return

    #遍历channel频道的订阅者链表,将消息发送给链表中的每一个订阅者
    for subscriber in server.pubsub_channels[channel]
        send_message(subscriber,message)

===========================================================================

def pattern_publish(channel,message)

    #遍历所有模式订阅消息
    for pubsubpattern in server.pubsub_patterns

        #如果频道和模式相匹配
        if match(channel,pubsubPattern.pattern):

            #那么将消息发送给该模式的客户端
            send_message(pubsubPattern.client,message)

============================================================================

def publish(channel,message)

    channel_publish(channel,message)
    pattern_publish(channel,message)

查看订阅消息

  • PUBSUB CHANNELS

PUBSUB CHANNELS [pattern] 子命令用于返回服务器当前被订阅的频道,其中pattern参数是可选的:如果不给定pattern参数,那么命令返回服务器当前被订阅的所有频道;如果给定pattern参数,那么命令返回服务器当前被订阅的频道中与pattern模式相匹配的频道。

  • PUBSUB NUMSUB

PUBSUB NUMSUB [channel-1 channel-2 …… channel-n]子命令接受任意多个频道作为输入参数,并返回这些频道的订阅者数量。

  • PUBSUB NUMPAT

PUBSUB NUMPAT子命令用于返回服务器当前被订阅模式的数量。

 

AES攻击方法 :差分密码分析 boomerang attack飞去来器攻击 AES具有123比特的分组长度,三种可选的密钥长度(128,192,256) AES是一个迭代型密码,轮数依赖于密钥长度。如果密钥长度为128比特,则轮数为10;如果密钥长度为192比特,则轮数为12;如果密钥长度为256比特,则轮数为14; 混淆(Confusion) 混淆是为了让密钥与密文的统计信息之间的关系变得复杂,从而增加通过统计方法进行攻击的难度。混淆可以通过各种代换算法实现,如S盒、乘法(加)与异或等运算组合,为非线性部件。 扩散(Diffusion) 扩散是为了让明文的单个比特影像到 阅读详情

相关推荐

An工具介绍之摄像头

An工具介绍之摄像头

人生得意须尽欢 6188

redis的消息订阅/发布总结

本地测试redis的pub/sub功能,本地主要是redis的缺陷,服务重启时会丢失信息的问题。发现redis的pub/sub功能还是比较薄弱,对于大量消息队列来说,不太合适,舍弃掉 import redis.clients.jedis.JedisPubSub; public class RedisMsgPubSubListener extends JedisPubSub

seapeak007的博客 3277

Mplus—交叉滞后面板模型(Cross-Lagged Panel Model, CLPM)

本文介绍交叉滞后模型相关知识,以及显变量模型与潜变量模型在Mplus中的语法。

m0_54401011的博客 1万+

深入理解Redis系列——发布与订阅详解

如果在调用B接口的发生异常,此时可能就导致下单支付接口返回失败,但是此时A接口其实已经调用成功,这就代表它内部已经处理下单支付成功的结果。如果就两个业务需要获取下单支付的结果,那也还好,程序改造也快。这样就会导致A,B,C三个下游接口,A获取成功获取支付结果,但是B,C没有拿到,导致三者系统数据不一致的情况。第一,下单支付业务与其他业务重度耦合,每当有个新业务需要支付结果,就需要改动下单支付的业务。后面如果又有新的业务,比如说积分服务,他需要获取下单支付的结果,然后增加用户的积分。...

weixin_41186611的博客 213

第二十三章 Nest集成日志框架Winston

Winston是一个非常流行的Node.js日志框架,而Nest.js是一个基于Node.js的后端框架。修改 winston.module.ts 内容如下 添加 forRoot 方法,接收 winston 的 createLogger 方法的参数,返回动态模块的 providers、exports。这里用到了 printf 的 format 函数,它可以自定义打印的日志格式 且使用了chalk 加上了颜色,并且打印了 dayjs 格式化的时间。可以看到控制台打印了自定义的 logger 的自定义。

枫ゞ的博客 1069

【Arc GIS 零基础教学】土地利用类型图的绘制方法

​Hi,我是胡学长!今天教大家怎么利用Arc GIS 绘制土地利用类型图。土地利用类型图是表达土地资源的利用现状、地域差异和分类的专题地图。它是研究土地利用的重要工具和基础资料,同时也是土地利用调查研究的主要成果之一。在编制土地利用图的基础上,对当前利用的合理程度和存在的问题、进一步利用的潜力、合理利用的方向和途径,进行综合分析和评价。因此,土地利用图是调整土地利用结构,因地制宜进行农业、工矿业和交通布局、城镇建设、区域规划、国土整治、农业区划等的一项重要科学依据。......

一起来交流学习吧 1万+

13. redis设计与实现学习笔记-发布与订阅

文章目录17. 发布与订阅17.1. 频道的订阅和退订17.1.1. 订阅频道17.1.2. 退订频道17.2. 模式的订阅与退订17.2.1. 订阅模式17.2.2. 退订模式17.3. 发送消息17.3.1. 将消息发送给频道订阅者17.3.2. 将消息发送给模式订阅者17.4. 查看订阅信息 17. 发布与订阅 17.1. 频道的订阅和退订 客户端可以通过 SUBSCRIBE 命令订阅某个或...

不准动我的小老弟 258

从量子兔AlphaPi硬件拆解到ESP32-C3库开发实战

本文详细拆解了量子兔AlphaPi开发板的硬件构成,重点分析了其核心ESP32-C3芯片及外围传感器。通过逆向工程揭示了GPIO引脚定义与通信协议,并实战演示了如何从零开发MicroPython库,驱动按键、加速度计及LED点阵,最终整合成一个互动平衡球游戏项目,展现了开源硬件在教育与二次开发中的潜力。

weixin_29164497的博客 460

《Redis设计与实现》学习笔记-发布订阅与事务

发布与订阅 Redis通过发布订阅提供一对多甚至是多对多的节点消息通信,发布订阅由PUBLISH、SUBSCRIBE、PSUBSCRIBE、PUBSUB等命令组成。 SUBSCRIBE命令:订阅某频道,在redisServer结构中通过pubsub_channels字典属性保存当前服务器所有频道的订阅关系,字典键时频道名称,字典值是一个链表,记录了所有订阅这个频道的客户端。UNSUBSCR

pentiumchen的专栏 897

告别CNN局限:用Transformer+迁移学习搞定高光谱图像分类(附Pytorch代码)

本文探讨了如何利用Transformer的自注意力机制和迁移学习策略解决高光谱图像分类中的挑战。通过结合CNN的局部特征提取和Transformer的全局建模能力,提出的DenseTransformer架构在多个数据集上实现了显著的性能提升。文章还提供了详细的PyTorch实现代码和工程优化技巧,帮助开发者快速应用这一技术。

weixin_32771907的博客 608

Ubuntu 24.04 高效部署Slurm集群:从零到生产环境实战

本文提供了一份在Ubuntu 24.04 LTS系统上从零开始部署生产级Slurm高性能计算集群的完整实战指南。内容涵盖网络配置、Munge安全认证、Slurm核心组件安装与配置,并深入讲解了cgroups资源隔离、NFS共享存储、配置无感知模式等生产环境优化技巧,最后通过实例演示如何提交与管理Slurm作业,帮助用户构建高效、稳定的计算平台。

weixin_29213655的博客 565

Redis发布订阅和应用场景

Redis发布订阅和应用场景 https://blog.youkuaiyun.com/fly910905/article/details/78495971 https://blog.youkuaiyun.com/w05980598/article/details/80444717 https://www.cnblogs.com/xinde123/p/8489054...

liNewman的博客 884

EAAI title-page-template 怎么填写: 期刊投稿作者信息填写指南

本文详细介绍了期刊投稿时作者信息填写的规范要求。主要内容包括:1)核心填写原则(信息一致性、标注清晰性、通讯作者唯一性);2)具体填写方法演示(作者姓名、单位/机构、通讯作者);3)常见错误规避指南(如单位上标错误、邮箱无效等);4)提供可直接套用的规范模板。特别强调作者姓名拼写、单位标注、通讯作者指定等关键细节,并以深圳大学和同济大学研究团队为例进行说明,帮助投稿者避免因格式问题被退回修改。

ZhangJiqun&191cm&85kg 1087

读书笔记:《Redis设计与实现》之发布订阅

【代码】读书笔记:《Redis设计与实现》之发布订阅。

fronge的博客 1209

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Redis设计与实现读书笔记七、发布、订阅和事务的原理

文章目录一、发布与订阅1、频道的订阅与退订1.1 订阅频道1.2 退订频道2、模式的订阅与退订2.1 订阅模式2.2 退订模式3、发送消息3.1 将消息发送给频道订阅者3.2 将消息发送给模式订阅者4、查看订阅信息4.1 PUBSUB CHANNELS4.2 PUBSUB NUMSUB4.3 PUBSUB NUMPAT5、重点回顾二、事务1、事务的实现1.1 事务开始1.2 命令入队1.3 事务队列1.4 执行事务2、WATCH命令的实现2.1 使用WATCH命令监视数据库键2.2 监视机制的触发2.3 .

小宇哥x的博客 292

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《Redis设计与实现》读书笔记——发布与订阅、事务、排序、二进制位数组

1、发布与订阅    发布与订阅功能有PUBLISH、SUBSCRIBE、PSUBSCRIBE(正则订阅,订阅某个模式)等命令组成。例如SUBSCRIBE "news.it"、PUBLISH "news.it" "hello"、PSUBSCRIBE "news.[ie]t"等。struct redisServer{ // 保存所有频道的订阅关系,Map&lt;channel,List&l...

weixin_39420024的博客 382

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Redis设计与实现读书笔记---发布订阅/事务/排序/慢查询

发布与订阅 当一个Redis客户端执行PUBLISH 命令将消息message发送给频道channel时,服务器执行如下动作: 将消息message发送给channel频道所以订阅者‘ 如果有一个或多个模式pattern与频道channel相匹配,那么消息message发送给pattern模式的订阅者; 命令 PUBSUB CHANNELS [pattern]:返回服务器当前被订阅的频道; PUBSUB NUMSUB [channel-1 channel-2 channel-n]:接收任意多个频道作为

生蛋的公鸡的博客 218

Redis设计与实现读书笔记

Redis、读书笔记、Redis源码分析、Redis原理分析

一个有信仰的技术人 1338

《Redis 设计与实现》读书概要

《Redis 设计与实现》读书笔记

u011447403的专栏 1498

【Redis】《Redis设计与实现》读书笔记

一、简单了解Redis     Redis是以快速读写数据为优势的工具,它是单线程的,占用较少的内存,开源的,以C语言实现的一种Key_Value数据库,在热点数据缓存,限时业务(利用了Redis的键生存时间),游戏排行榜后端服务器等等方面都有应用。 二、Redis的数据结构 2.1 字符串变量     Redis并没...

pointer_y的博客 283

《redis 设计与实现》读书笔记

大家好,我是烤鸭:     《redis 设计与实现》,读书笔记。 第一部分 数据结构与对象 第2章 简单动态字符串 Redis 使用SDS 作为字符串表示。 O(1) 复杂度获取字符串长度。 杜绝缓冲区溢出。 减少修改字符串长度时所需的内存重分配次数。 二进制安全。 兼容部分C字符串函数。 第3章 链表 每个链表节点由一个listNode结构标识,每个节点都有一个指向前置接点和后置节点的指针,实现是双端链表。 每个链表用list结构标识,结构带有表头节点指针、表尾节

烤鸭的世界我们不懂。 558

《Redis设计与实现》读书笔记

在Redis官网里有一个官方的交互式教程 点击进入 Redis数据库里面每个减值对(key-value)都是由对象(object)组成 键 总数一个字符串对象(string object) 值 可以是字符串对象 队列对象(list object) 哈希对象(hash object) 集合对象(set object) 有序集合对象(sorted set object) 这五种对象中的一种 ...

呆大王的博客 882

Redis设计与实现 读书笔记

redis 数据结构 Redis数据库里面的每个键值对(key-value pair)都是由对象(object)组成的,其中: 键总是一个字符串对象(string object), 值则可以是字符串对象(string object)、列表对象(list object)、哈希对象(hash object)、集合对象(set object)、有序集合对象(sorted set object)这五种对象...

flyingzc的博客 332

redis设计与实现读书笔记

目录 第一部分 数据结构与对象 第1章引 言 第2章 简单动态字符串 第3章 链表 第4章 字典 第5章 跳跃表 第6章 整数集合 第7章 压缩列表 第8章 对象 第二部分 单级数据库的实现 第9章 数据库 第10章 RDB持久化 第11章 AOF持久化 第12章 事件 第13章 客户端 第14章 服务器 第三部分 多机数据库的实现 第15章 复制 第16章 Sentinel 第17章 集群 第四部分 独立功能的实现 第18章 发布与订阅 第19章 事务 第.

逆水行舟,不进则退 681

《redis设计与实现》 读书笔记

读书笔记 一、前言 什么是redis: Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。简而言之redis就是放在远程网络上的一个key-value数据结构。 redis的使用场景: Redis可以用来做cache,也可以用来做持久化db,甚至用来做队列。队列就是存储临时性数据,而cache主要存储那些用...

kangbin825的专栏 2746

实现动态表头_《Redis设计与实现》读书笔记

《Redis设计与实现》读书笔记​www.woojean.com关系数据库并不直接支持交集计算操作,要计算两个集合的交集,除了需要对两个数据表执行合并(join)操作之外,还需要对合并的结果执行去重复(distinct)操作,最终导致交集操作的实现变得异常复杂。《Redis设计与实现》读书笔记关系数据库并不直接支持交集计算操作,要计算两个集合的交集,除了需要对两个数据表执行合并(join)操作之外...

weixin_35339622的博客 243
上一篇: redis设计与实现读书笔记——集群
下一篇: redis设计与实现读书笔记——底层数据结构
CCCCC_SSSSS
博客等级 码龄10年 3粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值