`
powersoft
  • 浏览: 199242 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
53a63413-d61c-321e-8dc6-5008e88923c6
Redis官方文档翻译和源...
浏览量:191974
社区版块
存档分类
最新评论

Redis官方文档(11) ——发布订阅

阅读更多
Redis3官方文档(11)
——发布订阅


    SUNSCRIBE,UNSUBSCRIBE和PUBLISH命令实现了发布/订阅范式,发送者(发布者)将它们的消息发送给特定的接收者(订阅者)(引用自维基百科)。更确切地说,,发布的消息进入频道(channel),而不需要知道订阅者的存在。订阅者只需要表达对一到多个频道的兴趣,并且只接收感兴趣的消息,不需要知道发布者的存在。这种发布者和订阅者的解耦可以带来更好的伸缩性和更加动态的网络拓扑。
    例如,为了订阅频道foo和bar,客户端发送一个SUNBCRIBE命令及频道的名称:
SUBSCRIBE foo bar

    其它客户端往这个频道发送的消息会被Redis推送到所有订阅的客户端。
    订阅一到多个频道的客户端不应该发送命令,尽管其可以订阅和取消订阅其它频道。订阅和取消订阅操作的回复以消息的形式进行发送,所以客户端只能读取连续的消息流,第一个元素表明消息的类型。处于订阅状态中的客户端允许使用的命令是SUBSCIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,PING和QUIT。

    推送消息的格式(Format of pushed messages)
    消息是一个三个元素的数组回复(Array reply)。
    第一个元素是消息的类型:
  • subscribe:表明我们成功地订阅了频道,频道作为第二个元素。第三个参数代表我们当前订阅的频道数量。
  • unsubscribe:表明我们成功地取消订阅了频道,频道作为第二个元素。第三个参数代表我们当前订阅的频道数量。当最后一个参数为零时,我们就没有订阅任何频道,客户端可以发送任何类型的Redis命令,因为我们已经不再处于发布/订阅状态。
  • message:作为另一个客户端发送的PUBLISH命令的结果而收到的消息。第二个元素是原始频道的名称,第三个参数是真实的消息负荷(payload)。


    数据库和作用域(Database & Scoping)
    发布/订阅和键空间没有关系。在任何层次上都不干预,包括数据库编号。
    在db 10上发布,也会被db 1上的订阅者收听到。
    如果你需要某种形式的作用域,请使用环境的名称(test,staging,production)作为频道的参数。

    线路协议样例(Wire protocol example)
SUBSCRIBE first second
*3
$9
subscribe
$5
first
:1
*3
$9
subscribe
$6
second
:2

    此时,我们从另一个客户端向名为sencond的频道发送了一个PUBLISH操作:
> PUBLISH second Hello

    下面是第一个客户端收到的:
*3
$7
message
$6
second
$5
Hello

    现在客户端使用不带额外参数的UNSUBSCRIBE命令从所有频道取消关注:
UNSUBSCRIBE
*3
$11
unsubscribe
$6
second
:1
*3
$11
unsubscribe
$5
first
:0

    模式匹配订阅(Pattern-matching subscriptions)
    Redis的发布/订阅实现支持模式匹配。客户端可以订阅通配符模式(glob-style patterns)来接收发送给所有名字匹配的频道的消息。
    例如:
PSUBSCRIBE news.*

    会收到发送给频道news.art.figurative,news.music.jazz等的全部消息。所有通配符模式都是合法的,所以多个通配符(wildcard)是支持的。
PUNSUBSCRIBE news.*

    会从这些模式取消订阅。其他订阅不会收这个调用的影响。
    作为模式匹配的结果而收到的消息以不同的格式被发送:
  • 消息类型是pmessage:这是由于另一个客户端发送PUBLISH命令并符合模式匹配的订阅的结果而接收到的消息。第二个元素是匹配到的原始模式,第三个元素是原始频道的名称,最后一个元素是真实的消息负荷。

    类似于SUBSCRIBE和UNSUBSCRIBE,PSUBSCRIBE和PUNSUBSCRIBE命令也会被系统回复确认(acknowledged),使用和sunscribe和unsubscribe相同的格式发送psubscribe和punsubscribe类型的消息。

    消息同时匹配模式和频道订阅(Messages matching both a pattern and a channel subscription)
    如果客户端订阅了多个与发布的消息相匹配的模式,或者如果客户端同时订阅了与发布的消息相匹配的模式和频道,客户端可能会多次收到同一条消息。向下面的例子:
SUBSCRIBE foo
PSUBSCRIBE f*

    在上面的例子中,如果一条消息发送给了频道foo,客户端会收到两条消息:一条message类型的,一条pmessage类型的。

    模式匹配时订阅数含义(The meaning of the subscription count with pattern matching)
    在subscribe,unsubscribe,psubscribe和punsubscribe消息类型中,最后一个参数是仍然活跃的订阅的计数。这个数字是客户端仍然在订阅的模式和频道的真实总数。所以,只有当这个计数由于从所有的频道和模式取消订阅而下降到零,客户端将退出 发布/订阅状态。

    编程样例(Programming example)
    Pieter Noordhuis提供了一个很好的样例,使用EventMachine和Redis创建了一个多人高性能的网页聊天(https://gist.github.com/pietern/348262 译者注)。

    客户端库实现小贴士(Client library implementation hints)
    由于收到的所有消息都包含引起消息传递的原始订阅(message类型时的频道,pmessage类型时的原始模式),客户端库可以使用哈希表将原始订阅绑定到回调(可以是匿名函数,代码块,函数指针)。
    当收到一条消息时,可以在O(1)复杂度内完成查找,来将消息传递给注册的回调。
===============================================================================
    大家好,我是阮威。华中科技大学,计算机软件专业硕士。毕业后加入腾讯,先后在腾讯电子商务部和无线游戏产品部工作,现供职于欢聚时代基础产品部。IT男,至今。欢迎大家收听我的公众账号。
2
3
分享到:
评论

相关推荐

    scala连接redis哨兵模式 demo 使用scala的redis库(csdn)————程序.pdf

    Redis具备数据复制、Lua脚本、事务、不同级别的持久化等多种功能,并通过发布/订阅模式支持消息系统。 哨兵模式是Redis的高可用解决方案之一。在哨兵模式下,一个或多个哨兵会监控主从服务器,并在指定的主服务器不...

    Redis学习-实战.docx

    - **发布订阅**:可用于消息队列等场景。 - **Lua 脚本**:内置 Lua 引擎,支持脚本执行,提高操作效率。 - **集群支持**:通过 Redis Cluster 实现横向扩展。 #### 二、Redis 在实战中的应用 ##### 2.1 缓存需求...

    Redis缓存数据库

    4. **发布/订阅模式**:Redis提供了发布订阅功能,允许客户端订阅特定频道,当有新消息发布到这些频道时,订阅者会收到通知,常用于实现消息队列。 5. **主从复制**:通过主从复制,可以创建多个副本,用于读取负载...

    redis-3.2.1.zip

    7. ** pub/sub(发布/订阅)**:Redis的发布/订阅功能允许客户端订阅特定频道,当有消息发布到该频道时,所有订阅者都会收到通知,适合构建实时消息系统。 8. **内存管理**:Redis是内存数据库,因此内存管理至关...

    Redis windows 32bit / b64bit

    - **队列**:利用列表或发布/订阅功能,Redis可作为简单的消息队列使用。 6. **社区与文档** - **社区支持**:Redis有庞大的开发者社区,提供丰富的插件和解决方案,遇到问题时可以寻求帮助。 - **官方文档**:`...

    redis-2.6.13.tar.gz

    6. **订阅/发布系统**:Redis提供了发布/订阅模式,使得多个客户端可以订阅同一主题并接收消息。 7. **Lua脚本**:用户可以通过内建的Lua解释器执行脚本,实现更复杂的逻辑操作。 8. **命令行工具**:Redis提供了`...

    redis-windows-3.0.rar

    Redis 是一个高性能的键值数据库,它在内存中存储数据并...在使用过程中,建议查阅官方文档以获取详细的配置选项和最佳实践,以充分利用 Redis 的性能和功能。同时,保持对最新版本的关注,以获取安全更新和新特性。

    redis-5.0.8.tar.gz

    5. **发布/订阅**:Redis 提供了 Pub/Sub(发布/订阅)模式,允许客户端订阅特定的频道,并在有新消息发布时实时接收。 6. **Lua 脚本**:Redis 内置了 Lua 解释器,用户可以通过 Lua 脚本来执行复杂的数据处理逻辑...

    spring-data-redis最新架包

    此外,Spring Data Redis还支持事务(Transactions)和发布/订阅(Pub/Sub)模式。通过`TransactionOperations`接口,开发者可以执行多条命令并在一个原子操作中提交或回滚。发布/订阅模式允许实时通信,通过`...

    Redis-x64-5.0.14 无需安装版

    这使得它能够处理各种类型的数据和场景,比如计数、队列、发布/订阅等。 4. **事务支持**:Redis 支持原子的多操作事务,确保一系列操作要么全部成功,要么全部失败。 5. **主从复制**:Redis 可以设置为主从模式...

    Redis-x64-2.8.2402.zip

    6. **发布/订阅**:Redis提供了发布/订阅模式,允许不同客户端之间通过主题进行异步通信。 7. **Windows平台支持**:尽管Redis主要设计用于Linux,但这个版本是专门为Windows操作系统编译的。Redis在Windows上的...

    redis-mac-5.0.5.tar.gz

    5. **pub/sub(发布/订阅)**:Redis的发布订阅功能使得可以实现消息传递,为实时消息应用提供支持。 6. **Sorted Set(有序集合)**:Redis的有序集合可以对集合中的元素进行排序,并且支持范围查询,适合做排行榜...

    最新版redis redis-6.0.7.tar.gz

    2. **流(Streams)**:Redis 6 引入了新的数据类型——Stream,用于构建复杂的数据日志和事件处理系统。Stream数据结构支持时间戳索引,可进行多消费者订阅,是发布/订阅模型的增强。 3. **事务改进**:尽管Redis不...

    一个非常简单的消息队列中间件。在redis数据库和hiredis的基础上,设计的一个-Easy_redis_mq.zip

    总结来说,Easy_redis_mq是一个基于Redis和Hiredis构建的简单消息队列中间件,它充分利用了Redis的发布/订阅功能,为开发者提供了一种快速搭建消息传递系统的方法。尽管标签信息为空,但通过标题和描述,我们可以...

    redis-Stable (4.0)

    它支持丰富的数据操作,如原子性操作、事务处理和发布订阅功能。 2. **Redis 4.0 特性**: - **流(Streams)**:Redis 4.0 引入了新的数据结构——流,它是一种复杂的数据结构,可以用来实现日志、时间序列数据存储...

    Redis 的 Go 客户端.zip

    发布/订阅。连接池。对 EVALSHA 持乐观态度的脚本帮助类型。用于处理命令回复的辅助函数。文档API 参考常问问题示例安装使用“go get”命令安装 Redigogo get github.com/gomodule/redigo/redisGo 发行版是 Redigo ...

    传智最新Linux+Redis源码资料

    至于Redis,其核心特性包括支持多种数据类型(如字符串、哈希、列表、集合、有序集合),TTL(Time To Live)机制实现自动过期,以及发布订阅模式等。通过"RedisDemo.zip",学习者可以实践如何使用Redis进行数据存取...

    archive_ Redis数据库 v7.0.12 [江西新余电信].zip.zip

    8. **消息队列**:通过发布/订阅模式,Redis可以作为消息中间件,用于解耦应用程序。 9. **模块系统**:Redis 6.0引入了模块系统,允许开发者扩展其功能,例如图数据库、全文搜索等。 在“Redis数据库 v7.0.12 ...

    redis的window版,直接打开启动可以,傻瓜式

    6. **发布/订阅(Pub/Sub)**:Redis的发布/订阅功能支持消息传递,可以构建实时消息系统或实现异步通信。 7. **集群**:Redis Cluster提供了一种水平扩展的方式,通过分片(sharding)将数据分布到多个节点上,提升...

Global site tag (gtag.js) - Google Analytics