`
longzhun
  • 浏览: 370203 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

六.redis 发布订阅

 
阅读更多

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。 pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。
下面做个实验。这里使用两个不同的client一个是redis自带的redis-cli另一个是用java写的简单的client。代码如下

import

 java.net.*;
import

 java.io.*;
public

 class

 PubSubTest 
{
 public

 static

 void

 main(String[] args) 
{
 String cmd = 
args[0]+"\r\n"

;
 try

 
{
 Socket 
socket = new

 
Socket("192.168.56.55"

,6379);
 
InputStream in = 
socket.getInputStream();
 
OutputStream out = socket.getOutputStream();
 
out.write(cmd.getBytes()); 
//发送订阅命令


 
byte

[] buffer = new

 
byte

[1024];
 
while

 (true) 
{
 
int

 readCount = 
in.read(buffer);
 
System.out.write(buffer, 0, 
readCount);
 
System.out.println("--------------------------------------"

);
 
}
 } catch

 (Exception e) 
{
 }
 
}
}
代码就是简单的从命令行读取传过来的订阅命令,然后通过一个socket连接发送给redis server,然后进入while循环一直读取redis server传过来订阅的消息。并打印到控制台
1 首先编译并运行此java程序(我是win7下面运行的)
D:\>

javac PubSubTest.java


D:\>

java PubSubTest "subscribe 
news.share

 
news.blog

"
*3
$9
subscribe
$10
news.share


:1
*3
$9
subscribe
$9
news.blog


:2
--------------------------------------
2 启动redis-cli
redis>

 psubscribe news.*
Reading messages... (press 
Ctrl-c to quit)
1. "psubscribe"
2. "news.*"
3. (integer) 1
3 再启动一个redis-cli用来发布两条消息
redis>

 publish news.share

 "share a link

 
http://www.google.com"


(integer) 2
redis>

 publish 
news.blog

 "I post a blog"
(integer) 2
4.查看两个订阅client的输出
此时java client打印如下内容
*3
$7
message
$10
news.share


$34
share a link

 
http://www.google.com


--------------------------------------
*3
$7
message
$9
news.blog


$13
I 
post a blog
--------------------------------------
另一个redis-cli输出如下
1. "pmessage"
2. "news.*"
3. "news.share

"
4. "share a link

 
http://www.google.com"


1. "pmessage"
2. "news.*"
3. "news.blog

"
4. 
"I post a blog"
分析下
java client使用subscribe命令订阅news.share和news.blog两个通道,然后立即收到server返回的订阅成功消息,可以看出 redis的协议是文本类型的,这里不解释具体协议内容了,可以参考http://redis.io/topics/protocol 或者http://terrylee.me/blog/post/2011/01/26/redis-internal-part3.aspx 。这个报文内容有两部分,第一部分表示该socket连接上使用 subscribe订阅news.share成功后,此连接订阅通道数为1,后一部分表示使用subscribe订阅news.blog成功后,该连接订 阅通道总数为2。
redis client使用psubscribe订阅了一个使用通配符的通道(*表示任意字符串),此订阅会收到所有与news.*匹配的通道消息。redis- cli打印到控制台的订阅成功消息表示使用psubscribe命令订阅news.*成功后,连接订阅通道总数为1。
当我们在一个client使用publish 向news.share和news.blog通道发出两个消息后。redis返回的(integer) 2表示有两个连接收到了此消息。通过观察两个订阅者的输出可以验证。具体格式不解释了,都比较简单。
看 完一个小例子后应该对pub/sub功能有了一个感性的认识。需要注意的是当一个连接通过subscribe或者psubscribe订阅通道后就进入订 阅模式。在这种模式除了再订阅额外的通道或者用unsubscribe或者punsubscribe命令退出订阅模式,就不能再发送其他命令。另外使用 psubscribe命令订阅多个通配符通道,如果一个消息匹配上了多个通道模式的话,会多次收到同一个消息。
jredis目前版本没提供pub/sub支持,不过自己实现一个应该也挺简单的。整个应用程序可以共享同一个连接。因为redis返回的消息报文中除了消息内容本身外还包括消息相关的通道信息,当收到消息后可以根据不同的通道信息去调用不同的callback来处理。
另外个人觉得redis的pub/sub还是有点太单薄(实现才用150行代码)。在安全,认证,可靠性这方便都没有太多支持。

from:http://www.cnblogs.com/xhan/archive/2011/02/06/1949473.html

分享到:
评论

相关推荐

    ServiceStack.Redis-5.8无限制.zip

    6. **发布/订阅(Pub/Sub)**:ServiceStack.Redis提供了丰富的订阅者和发布者接口,支持实时消息传递,这对于构建分布式事件系统或实现实时通知非常有用。 7. **持久化策略**:Redis提供了多种数据持久化策略,如...

    StackExchange.Redis .NET4.0

    6. **发布/订阅(Pub/Sub)模式**:StackExchange.Redis支持Redis的发布/订阅功能,允许开发人员实现事件驱动的通信。`Subscribe`和`Unsubscribe`方法可以用来注册和取消订阅频道,而`Publish`方法则用于发送消息。 ...

    StackExchange.Redis-1.2.6精简,附64位dll

    3. **发布/订阅(Pub/Sub)**:StackExchange.Redis支持Redis的发布订阅模式,允许程序作为发布者发送消息到频道,其他订阅者可以接收这些消息。这对于实现解耦的实时消息传递非常有用。 4. **事务支持**:Redis...

    ServiceStack.Redis 3.9

    4. **发布/订阅(Pub/Sub)模式**:支持Redis的发布/订阅模式,允许应用程序之间进行实时通信,这对于构建事件驱动的架构非常有用。 5. **事务支持**:ServiceStack.Redis允许用户在Redis中执行原子的事务操作,...

    ServiceStack.Redis操作工具类

    ServiceStack.Redis库为.NET开发者提供了全面的Redis功能,包括但不限于连接管理、序列化支持、发布/订阅模式等。 在使用ServiceStack.Redis操作工具类时,你需要了解以下关键知识点: 1. **连接管理**:...

    ServiceStack.redis v3.9.71

    开发者可以利用它来执行各种操作,如设置和获取键值、处理哈希表、发布订阅消息、操作集合和有序集合等。此外,它还支持事务、持久化和主从复制等Redis特性。 StackExchange.Redis.1.2.6是另一个Redis客户端库,...

    C# 使用 ServiceStack.Redis 必须的4个dll

    它提供了一个高级、易用的API,用于执行各种Redis操作,如设置和获取键值、操作集合、发布订阅消息等。通过这个库,开发者可以方便地在C#代码中管理Redis的数据结构,如字符串、哈希、列表、集合和有序集合。 3. **...

    C# Redis发布与订阅系统源码

    本项目提供了一个基于C#的Redis发布与订阅(Publish/Subscribe)系统的源码,帮助开发者了解如何在Windows Forms(Winform)应用中实现这一功能。 首先,我们需要了解Redis的发布/订阅模式。在这个模式下,发送者...

    ServiceStack.Redis 目前最新版6.9.0.0绕过6000限制

    ServiceStack.Redis作为.NET客户端,提供了丰富的API,可以方便地执行各种Redis操作,如设置和获取键值、发布订阅消息、操作集合类型(如列表、集合、有序集合)等。 在.NET 6控制台项目中使用ServiceStack.Redis,...

    NServiceKit.Redis.rar

    除了基本操作,NServiceKit.Redis还支持发布/订阅(Pub/Sub)模式,这是Redis的消息传递机制,可用于实现简单的消息队列。例如,你可以订阅一个频道并接收消息: ```csharp var sub = redis.CreateSubscription(); ...

    Redis发布订阅.net实现

    标题"Redis发布订阅.net实现"所涉及的关键知识点包括: 1. Redis的发布订阅机制: 发布订阅模式在Redis中由`PUBLISH`和`SUBSCRIBE`命令支持。发布者通过`PUBLISH`命令将消息发送到一个特定的频道,而订阅者则通过`...

    (5.9.3.0)ServiceStack.Redis(已取消6000限制)

    7. 发布/订阅消息:利用`Subscribe`和`Publish`功能实现消息传递。 8. 事务处理:使用`BeginTransaction`、`Execute`和`Commit`进行多条命令的原子操作。 此外,ServiceStack.Redis还支持高级特性,如Lua脚本执行、...

    StackExchange.Redis-中文使用文档.pdf

    StackExchange.Redis中文使用文档....StackExchange.Redis中文使用文档是Redis C# 客户端的详细使用指南,涵盖了基础配置、事件同步、键查找、管道与重用、链接分析、发布订阅、顺序脚本、超时事务等多方面的知识点。

    ServiceStack.Redis-master (1).zip

    另外,ServiceStack.Redis还支持发布/订阅(pub/sub)模式,这是Redis的一个重要特性,用于实现简单的消息传递。通过此功能,你可以创建分布式事件系统,使得不同服务之间可以相互通信,而无需直接耦合。 除此之外...

    StackExchange.Redis文档翻译.pdf

    另外,可以使用频道(Channels)实现发布/订阅模式的消息传递。 5. **事务(Transactions)**: StackExchange.Redis支持Redis的事务功能,允许在一个操作中执行多条命令,并确保它们原子性地执行。 6. **事件**...

    ServiceStack.Redis.dll

    3. **发布/订阅(Pub/Sub)**:提供消息发布与订阅功能,实现事件驱动的通信模式,适合构建实时应用或广播消息。 4. **事务(Transactions)**:支持原子操作的事务处理,确保多个命令的执行顺序和一致性。 5. **...

    StackExchange.Redis缓存扩展

    Redis支持两种主要的消息队列模式:发布/订阅(Pub/Sub)和列表(List)。发布/订阅模式用于广播消息,而列表模式则支持工作队列模型,其中生产者添加任务到列表的一端,消费者从另一端取出并处理任务。 在...

    ServiceStack.Redis 源码

    5. **发布/订阅(Pub/Sub)**:实现了 Redis 的发布/订阅功能,使得客户端可以订阅感兴趣的消息主题,实现解耦的通信模式。 6. **事务处理**:支持 Redis 事务,允许在一个原子操作中执行多个命令,确保数据的一致性。...

    在ASP.NET MVC中使用StackExCahnge.Redis实现用户登陆,并保持登陆

    另外,考虑使用Redis的发布/订阅(Pub/Sub)模式进行消息通信,或者使用Transactions保证数据的一致性。 通过以上步骤,我们可以在ASP.NET MVC应用中利用StackExchange.Redis实现用户登录并保持登录状态。这不仅提高...

    基于netcore 3.0的redis发布订阅示例代码

    Console.WriteLine("按任意键退出订阅..."); Console.ReadKey(true); sub.UnsubscribeAll(); redis.Close(); } } ``` 订阅者同样连接到Redis服务器,使用`GetSubscriber`创建一个订阅器,并订阅`testChannel`。...

Global site tag (gtag.js) - Google Analytics