首页 > 数据库 >redis的订阅与发布

redis的订阅与发布

时间:2024-05-08 21:12:58浏览次数:19  
标签:订阅 频道 redis channels 发布 input channel pubsub

1.订阅的关系维护

redis的所有频道的订阅关系都维护在pubsub_channels字典里面,这个字典的key是被订阅的频道,而value是订阅客户端的链表。

struct redisServer {
    // ...
    
    // 保存所有订阅关系
    dict *pubsub_channels;
    // ...
}

字典示例:

与此类似,服务器也将所有模式的订阅关系保存在pubsub_patterns属性内:

struct redisServer {
    // ...
    
    // 链表保存所有订阅模式关系
    list *pubsub_patterns;
    // ...
}

2.订阅频道与模式

每当客户端执行SUBSCRIBLE命令订阅频道的时候,会将频道订阅关系记录到pubsub_channels字典中进行跟踪,且同时会记录模式订阅关系

频道订阅关系可以使用如下伪代码来描述,模式订阅类似就不再赘述:

def subscrible(*all_input_channels):
    # 如果该频道没有被订阅,则直接加入字典,如果已有订阅,则在当前的key追加client
    for input_channel in all_input_channels:
        if input_channel not in server.pubsub_channels:
            server.pubsub_channels[input_channel] = []
        server.pubsub_channels[input_channel].append(client)

3.发送消息

当一个redis客户端执行PUBLIASH 发送消息到对应的channel的时候,服务器会执行两个操作:

  • 将消息发送给频道的所有订阅者

  • 如果有一个或多个模式与频道匹配,那么将发送给这些模式的订阅者

下面举例说明一下频道订阅的发送:

def channel_publish(channel, message):
    # 如果频道不在 pubsub_channels内说明无人订阅直接返回
    if channel not in server.pubsub_channels:
        return
    # 如果在的话说明至少有一个订阅者,遍历将消息发送
    for subcrible in server.pubsub_channels[channel]:
        send_message(subcrible, message)

4.利用有序集合来实现延迟队列

Redis对于MQ来说,其实没有什么高级特性,也没有ACK机制,如果对消息的准确性要求较高,还是建议使用MQ。

Redis的有序集合叫做ZSET,zset的结构如下:

struct zset {
    skiplist *skiplist;
    dict *dict;
}

zset同时使用了字典和跳表,同时使用这两种特性同时保证了范围查询和单个SCORE查询的效率,skiplist可以很好的支持ZRANGE查询,而dict可以很好的支持查询某个对象的SCORE。

可以看一下ZSET的数据结构

如果要使用该特性来实现延迟队列,那么我们需要在SCORE内存储对应的延迟时间,我们通过客户端取数据的时候需要用SCORE来进行过滤,获取当前时间该处理的数据。

标签:订阅,频道,redis,channels,发布,input,channel,pubsub
From: https://www.cnblogs.com/xu-xiaofeng/p/18180888

相关文章

  • 小组练习:请列出关于创新感受最深的几点启发在学习通提交解答的同时,可以同步发布在团队
    ]小组练习:请列出关于创新感受最深的几点启发在学习通提交解答的同时,可以同步发布在团队和个人博客上,作为学习心得体会,记录下来。我的答案:【第二组】答:1.勇于尝试与接受失败:创新意味着打破常规,尝试新的方法和思路。在这个过程中,失败是不可避免的。然而,正是这些失败,成为了我们......
  • 小组练习 :结合本小组项目写下能想到的所有 SWOT在学习通提交解答的同时,可以同步发布在
    小组练习:结合本小组项目写下能想到的所有SWOT在学习通提交解答的同时,可以同步发布在团队和个人博客上,作为学习心得体会,记录下来。我的答案:【第二组】答:SWOT分析是一种战略规划工具,用于评估一个项目或企业的优势(Strengths)、劣势(Weaknesses)、机会(Opportunities)和威胁(Threat......
  • 讨论 :银弹真的有用么? 在学习通提交解答的同时,可以同步发布在团队和个人博客上,作为
    银弹在项目管理和团队协作中是一种特殊的工具,其有效性和适用性取决于具体的团队和项目环境。这里是关于银弹的一些讨论点和考虑因素:优点:快速决策:当团队成员之间出现争执时,银弹可以帮助快速做出决策,避免争论持续下去,节省时间和精力。明确权威:银弹赋予特定角色(Dev/Test/PM)决策权,......
  • 个人练习(每个同学都要提交)——学习和使用多个平台上的测试工具 请使用两种以上平台上
    答:在"校园跑腿"项目中,我们可以使用两种不同的测试工具来确保软件的质量和稳定性。这些测试工具可以包括自动化测试工具和手动测试工具。以下是两种测试工具的介绍以及如何在项目中使用它们:SeleniumWebDriver(自动化测试工具):SeleniumWebDriver是一个流行的自动化测试工具,用于测......
  • 个人练习(每个同学都要提交)——学习和使用多个平台上的测试工具 请使用两种以上平台上
    在本小组项目中,我们使用以下两种平台上的测试工具:Postman和Swagger。Postman:Postman是一款功能强大的API测试工具,可以用于创建、调试和测试API。首先,我们需要创建一个Postman账号,并安装Postman应用程序。在项目中,我们可以使用Postman来进行API端点的测试。我们可以创建多个请求......
  • docker搭建redis集群(三主三从)及重启redis集群 redis扩容新增集群
    docker搭建redis集群(三主三从)及重启redis集群一、docker搭建redis集群1、下载redis镜像文件从远程仓库先拉取一下redis的镜像文件,如果已经提前安装过镜像的,可以跳过此步骤:dockerpullredis:6.0.82、查看本地拉取到镜像文件dockerimages 看到图上标识,就说明当前镜像文件已......
  • Redis
    redis是什么?为什么使用?基于内存的,k,v形式非关系型数据库,单机可支持十万tps。为什么使用?解决并发、性能问题,弥补关系型数据库的不足。redis的特点?1.高可用架构2.高性能3.支持持久化4.支持多种数据结构5.支持pub/sub消息模式6.支持多种语言7.原子操作,所有操作都是原子操作,......
  • 【container】【docker-compose】【mysql】【redis】【rabbit mq】【mongo】【elastic
    @目录写在前面mysqlredisrabbitmqmongoelasticsearch单节点多节点参考资料dockerkuberneteshelmk3s写在前面相关博文个人博客首页免责声明:仅供学习交流使用!开源框架可能存在的风险和相关后果将完全由用户自行承担,本人不承担任何法律责任。mysqlversion:'3'services:......
  • 一键自动化博客发布工具,用过的人都说好(阿里云篇)
    阿里云有个开发者社区,入驻过的朋友可能想要把自己的博客发布到阿里云社区上。今天我来介绍一下blog-auto-publishing-tools自动发布博客到阿里云的实现原理。阿里云的博客发布界面比较简单,只有标题,正文,摘要,关联试用产品,发布子社区,文章图片这几个选项。一起来看看如何实现吧。......
  • Docker 部署 Redis
    获取镜像#拉取镜像此处我们拉取的是官方最新镜像,其它版本可以去DockerHub查询[root@VM-24-9-centos~]#dockerpullredis:7.2创建挂载目录并复制相关文件##创建挂载目录[root@VM-0-17-centos~]#mkdir-pdata/redis/{conf,data}##切换到conf目录并下载配置文件和......