当前位置: 首页 > news >正文

无代码网站开发平台有哪些域名查询ip爱站网

无代码网站开发平台有哪些,域名查询ip爱站网,开发一款游戏需要多少钱,如何自己做网站及优化目录 1.Redis发布订阅简介 2.发布/订阅使用 2.1 基于频道(Channel)的发布/订阅 2.2 基于模式(pattern)的发布/订阅 3.深入理解Redis的订阅发布机制 3.1 基于频道(Channel)的发布/订阅如何实现的? 3.2 基于模式(Pattern)的发布/订阅如何实现的? 3.3 Sp…

目录

1.Redis发布订阅简介

2.发布/订阅使用

   2.1 基于频道(Channel)的发布/订阅

   2.2 基于模式(pattern)的发布/订阅

3.深入理解Redis的订阅发布机制

   3.1 基于频道(Channel)的发布/订阅如何实现的?

   3.2 基于模式(Pattern)的发布/订阅如何实现的?

   3.3 SpringBoot结合Redis发布/订阅实例?


1.Redis发布订阅简介

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

Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。

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

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

 

2.发布/订阅使用

Redis有两种发布/订阅模式:

  • 基于频道(Channel)的发布/订阅
  • 基于模式(pattern)的发布/订阅

   2.1 基于频道(Channel)的发布/订阅

"发布/订阅"模式包含两种角色,分别是发布者和订阅者。发布者可以向指定的频道(channel)发送消息; 订阅者可以订阅一个或者多个频道(channel),所有订阅此频道的订阅者都会收到此消息。

  • 发布者发布消息

发布者发布消息的命令是 publish,用法是 publish channel message,例如向 channel1.1说一声hi

 

这样消息就发出去了。返回值表示接收这条消息的订阅者数量。发出去的消息不会被持久化,也就是有客户端订阅channel:1后只能接收到后续发布到该频道的消息,之前的就接收不到了。

  • 订阅者订阅频道

订阅频道的命令是 subscribe,可以同时订阅多个频道,用法是 subscribe channel1 [channel2 ...],例如新开一个客户端订阅上面频道:(不会收到消息,因为不会收到订阅之前就发布到该频道的消息)

执行上面命令客户端会进入订阅状态,处于此状态下客户端不能使用除subscribeunsubscribepsubscribepunsubscribe这四个属于"发布/订阅"之外的命令,否则会报错。

进入订阅状态后客户端可能收到3种类型的回复。每种类型的回复都包含3个值,第一个值是消息的类型,根据消类型的不同,第二个和第三个参数的含义可能不同。

消息类型的取值可能是以下3个:

  • subscribe。表示订阅成功的反馈信息。第二个值是订阅成功的频道名称,第三个是当前客户端订阅的频道数量。
  • message。表示接收到的消息,第二个值表示产生消息的频道名称,第三个值是消息的内容。
  • unsubscribe。表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量,当此值为0时客户端会退出订阅状态,之后就可以执行其他非"发布/订阅"模式的命令了。

   2.2 基于模式(pattern)的发布/订阅

如果有某个/某些模式和这个频道匹配的话,那么所有订阅这个/这些频道的客户端也同样会收到信息。

  • 用图例解释什么是基于模式的发布订阅

下图展示了一个带有频道和模式的例子, 其中 tweet.shop.* 模式匹配了 tweet.shop.kindle 频道和 tweet.shop.ipad 频道, 并且有不同的客户端分别订阅它们三个:

当有信息发送到 tweet.shop.kindle 频道时, 信息除了发送给 clientX 和 clientY 之外, 还会发送给订阅 tweet.shop.* 模式的 client123 和 client256 :

另一方面, 如果接收到信息的是频道 tweet.shop.ipad , 那么 client123 和 client256 同样会收到信息:

 

  • 基于模式的例子

通配符中?表示1个占位符,*表示任意个占位符(包括0),?*表示1个以上占位符。

publish发布

psubscribe订阅 

  • 注意点

(1)使用psubscribe命令可以重复订阅同一个频道,如客户端执行了psubscribe c? c?*。这时向c1发布消息客户端会接受到两条消息,而同时publish命令的返回值是2而不是1。同样的,如果有另一个客户端执行了subscribe c1psubscribe c?*的话,向c1发送一条消息该客户顿也会受到两条消息(但是是两种类型:message和pmessage),同时publish命令也返回2.

(2)punsubscribe命令可以退订指定的规则,用法是: punsubscribe [pattern [pattern ...]],如果没有参数则会退订所有规则。

(3)使用punsubscribe只能退订通过psubscribe命令订阅的规则,不会影响直接通过subscribe命令订阅的频道;同样unsubscribe命令也不会影响通过psubscribe命令订阅的规则。另外需要注意punsubscribe命令退订某个规则时不会将其中的通配符展开,而是进行严格的字符串匹配,所以punsubscribe * 无法退订c*规则,而是必须使用punsubscribe c*才可以退订。(它们是相互独立的,后文可以看到数据结构上看也是两种实现)

3.深入理解Redis的订阅发布机制

   3.1 基于频道(Channel)的发布/订阅如何实现的?

底层是通过字典(图中的pubsub_channels)实现的,这个字典就用于保存订阅频道的信息:字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。

  • 数据结构

比如说,在下图展示的这个 pubsub_channels 示例中, client2 、 client5 和 client1 就订阅了 channel1 , 而其他频道也分别被别的客户端所订阅:

  • 订阅

当客户端调用 SUBSCRIBE 命令时, 程序就将客户端和要订阅的频道在 pubsub_channels 字典中关联起来。

举个例子,如果客户端 client10086 执行命令 SUBSCRIBE channel1 channel2 channel3 ,那么前面展示的 pubsub_channels 将变成下面这个样子:

  • 发布

当调用 PUBLISH channel message 命令, 程序首先根据 channel 定位到字典的键, 然后将信息发送给字典值链表中的所有客户端。

比如说,对于以下这个 pubsub_channels 实例, 如果某个客户端执行命令 PUBLISH channel1 "hello moto" ,那么 client2 、 client5 和 client1 三个客户端都将接收到 "hello moto" 信息:

  • 退订

使用 UNSUBSCRIBE 命令可以退订指定的频道, 这个命令执行的是订阅的反操作: 它从 pubsub_channels 字典的给定频道(键)中, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。

   3.2 基于模式(Pattern)的发布/订阅如何实现的?

底层是pubsubPattern节点的链表。

  • 数据结构 redisServer.pubsub_patterns 属性是一个链表,链表中保存着所有和模式相关的信息:

链表中的每个节点都包含一个 redis.h/pubsubPattern 结构:

 

client 属性保存着订阅模式的客户端,而 pattern 属性则保存着被订阅的模式。

每当调用 PSUBSCRIBE 命令订阅一个模式时, 程序就创建一个包含客户端信息和被订阅模式的 pubsubPattern 结构, 并将该结构添加到 redisServer.pubsub_patterns 链表中。

作为例子,下图展示了一个包含两个模式的 pubsub_patterns 链表, 其中 client123 和 client256 都正在订阅 tweet.shop.* 模式:

  • 订阅

如果这时客户端 client10086 执行 PSUBSCRIBE broadcast.list.* , 那么 pubsub_patterns 链表将被更新成这样

通过遍历整个 pubsub_patterns 链表,程序可以检查所有正在被订阅的模式,以及订阅这些模式的客户端。

  • 发布

发送信息到模式的工作也是由 PUBLISH 命令进行的, 显然就是匹配模式获得Channels,然后再把消息发给客户端。

  • 退订

使用 PUNSUBSCRIBE 命令可以退订指定的模式, 这个命令执行的是订阅模式的反操作: 程序会删除 redisServer.pubsub_patterns 链表中, 所有和被退订模式相关联的 pubsubPattern 结构, 这样客户端就不会再收到和模式相匹配的频道发来的信息。

   3.3 SpringBoot结合Redis发布/订阅实例?

最佳实践是通过RedisTemplate,关键代码如下:

// 发布
redisTemplate.convertAndSend("my_topic_name", "message_content");// 配置订阅
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(xxxMessageListenerAdapter, "my_topic_name");

本篇文章借鉴于:订阅与发布 — Redis 设计与实现 (redisbook.readthedocs.io) 

http://www.tj-hxxt.cn/news/72284.html

相关文章:

  • 凡科网官方网站哪里有免费的网站推广服务
  • 招聘网站开发源码北京网站优化排名
  • 网站开发 asp.net php网站seo是啥
  • 新余市建设厅网站免费网页在线客服系统
  • 51我们一起做网站核心关键词
  • 做爰网站下载怎么推广公司网站
  • 大兴 网站建设怀化seo推广
  • 线上赚钱正规平台上海网络seo优化公司
  • 网站建设期末题答案百度推广电话销售话术
  • 潍坊医院网站建设营销型网站建设的5大技巧
  • 乐平网站设计国际足联世界排名
  • 北京网站备案代理免费推广链接
  • 一个网站2级域名多百度快照怎么用
  • h5个人网站模板下载大的网站建设公司
  • 外包人员360优化大师官方网站
  • 池州海绵城市建设官方网站百度下载免费
  • 手机微信网站怎么做的好长沙网络公司最新消息
  • 平面设计素材网站知乎企业软文怎么写
  • 鹤壁人民医院网站开发六六seo基础运营第三讲
  • 广州外贸网站设计成都网站排名 生客seo
  • web网页开发工程师seo技术外包
  • 北京展览网站建设免费seo网站诊断
  • 长春专业企业网站建设工作室关键词林俊杰mp3下载
  • 做网站花了2万多怎样才能在百度上发布信息
  • 怎么在58同城上做网站北京百度seo
  • 陕西交通建设集团西长分公司网站整站优化 快速排名
  • wordpress默认分类链接seo排名优化方式方法
  • 百度网站架构免费seo软件推荐
  • 海尔网站建设推广seo是什么意思新手怎么做seo
  • 黑龙江公司网站建设手机网站免费客服系统