zoukankan      html  css  js  c++  java
  • Redis

    Redis 提供了一组命令可以让开发者实现 “发布/订阅” 模式。“发布/订阅” 可以实现进程间的消息传递,其原理是这样的:

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

    发布者发布消息的命令是 PUBLISH,用法是 PUBLISH channel message,如向 channel.1 说一声 “hi”:

    redis> PUBLISH channel.1 hi
    (integer) 0

    这样消息就发出去了。PUBLISH 命令的返回值表示接收到这条消息的订阅者数量。因为此时没有客户端订阅 channel.1,所以返回 0。发出去的消息不会被持久化,也就是说当有客户端订阅 channel.1 后只能收到后续发布到该频道的消息,之前发送的就收不到了。

    订阅频道的命令是 SUBSCRIBE,可以同时订阅多个频道,用法是 SUBSCRIBE channel [channel ...]现在新开一个 redis-cli 实例 A,用它来订阅 channel.1:

    redis A> SUBSCRIBE channel.1
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "channel.1"
    3) (integer) 1

    执行 SUBSCRIBE 命令后客户端会进入订阅状态,处于此状态下客户端不能使用除 SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE 和 PUNSUBSCRIBE 这 4 个属于 “发布/订阅” 模式的命令之外的命令,否则会报错。

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

    (1)subscribe。表示订阅成功的反馈信息。第二个值是订阅成功的频道名称,第三个值是当前客户端订阅的频道数量。

    (2)message。表示接收到的消息。第二个值表示产生消息的频道名称,第三个值是消息的内容。

    (3)unsubscribe。表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量,当次值为 0 时客户端会退出订阅状态,之后就可以执行其他非 “发布/订阅” 模式的命令了。

    上例中当实例 A 订阅了 channel.1 进入订阅状态后收到了一条 subscribe 类型的回复,这时我们打开另一 redis-cli 实例 B,并向 channel.1 发送一条消息:

    redis B> PUBLISH channel.1 hi!
    (integer) 1

    返回值为 1,表示有一个客户端订阅了 channel.1,此时实例 A 收到了类型为 message 的回复:

    1) "message"
    2) "channel.1"
    3) "hi!"

    使用 UNSUBSCRIBE 命令可以取消指定的频道,用法为 UNSUBSCRIBE [channel [channel ...]],如果不指定频道则会取消订阅所有频道。由于 redis-cli 的限制,无法在其中测试 UNSUBSCRIBE 命令。

    按照规则订阅

    除了可以使用 SUBSCRIBE 命令订阅指定名称的频道外,还可以使用 PSUBSCRIBE 命令订阅指定的规则。规则支持 glob 风格通配符格式,下面新打开一个 redis-cli 实例 C 进行演示:

    redis C> PSUBSCRIBE channel.?*
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "channel.?*"
    3) (integer) 1

    规则 channel.?* 可以匹配 channel.1 和 channel.10,但不会匹配 channel.。这时在实例 B 中发布消息:

    127.0.0.1:6379> PUBLISH channel.1 hi!
    (integer) 2

    返回结果为 2 是因为实例 A 和实例 C 两个客户端都订阅了 channel.1 频道。实例 C 接收到的回复是:

    1) "pmessage"
    2) "channel.?*"
    3) "channel.1"
    4) "hi!"

    第一个值表示这条消息是通过 PSUBSCRIBE 命令订阅频道而收到的,第二个值表示订阅时使用的通配符,第三个值表示实际收到消息的频道命令,第三个值则是消息内容。

    使用 PSUBSCRIBE 命令可以重复订阅一个频道,如某客户端执行 PSUBSCRIBE channel.? channel.?*,这时向 channel.2 发布消息后该客户端会收到两条消息,而同时 PUBLISH 命令返回的值也是 2 而不是 1。同样的,如果有另一客户端执行了 SUBSCRIBE channel 10 和 PSUBSCRIBE channel.?* 的话,向 channel.10 发送命令该客户端也会收到两条消息(但是是两种类型:message 和 pmessage),同时 PUBLISH 命令会返回 2。

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

    使用 PUNSUBSCRIBE 命令只能退订通过 PSUBSCRIBE 命令订阅的规则,不会影响直接通过 SUBSCRIBE 命令订阅的频道;同样 UNSUBSCRIBE 命令也不会影响通过 PSUBSCRIBE 命令订阅的规则。另外容易出错的一点是使用 PUNSUBSCRIBE 命令退订某个规则时不会将其中的通配符展开,而是进行严格的字符串匹配,所以 PUNSUBSCRIBE * 无法退订 channel.* 规则,而是必须使用 PUNSUBSCRIBE channel.* 才能退订。

  • 相关阅读:
    .NET简谈插件系统开发模式
    .NET实现之(自动更新)
    .NET简谈互操作(二:先睹为快)
    .NET实现之(WebBrowser数据采集—基础篇)
    .NET简谈设计模式之(观察者模式)
    .NET简谈平台大局观
    .NET实现之(简易ORM)
    .NET简谈面向接口编程
    .NET简谈事件与委托
    .NET实现之(WebBrowser数据采集—终结篇)
  • 原文地址:https://www.cnblogs.com/huey/p/5723296.html
Copyright © 2011-2022 走看看