`
jzkangta
  • 浏览: 160973 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

六 redis学习笔记之发布订阅(转)

    博客分类:
  • JAVA
 
阅读更多
原文地址:http://www.cnblogs.com/xhan/archive/2011/02/06/1949473.html

发布订阅(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行代码)。在安全,认证,可靠性这方便都没有太多支持。
分享到:
评论

相关推荐

    Redis学习笔记整理

    一、 redis 环境搭建 2 二、 redis学习笔记之数据类型 3 三、 redis学习笔记之...六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31

    Redis学习笔记.rar

    redis学习笔记整理 一、 redis 环境搭建 2 二、 redis学习笔记之数据类型 3...六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31

    redis学习笔记.zip

    这个“redis学习笔记.zip”压缩包很可能是包含了关于Redis的学习资料,可能包括概念解释、操作教程、实践案例等内容,适合初学者和有一定基础的学习者参考。 Redis的学习可以分为以下几个主要部分: 1. **基础知识...

    Redis全套学习笔记

    它支持多种数据结构,包括字符串(String)、链表(List)、哈希(Hash)、集合(Set)和有序集合(Zset),这些丰富的数据结构使得Redis在缓存、计数、发布订阅系统等多种场景下表现出色。 1. Redis 概述与安装: Redis ...

    redis学习笔记.pdf

    Redis学习笔记 Redis是一个开源的基于键值对(Key-Value)NoSQL数据库,使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API。Redis可以被称为KV数据库,键值对数据库,内部存储...

    Redis全套学习笔记-带章节目录-114页.pdf

    Redis全套学习笔记 Redis是一种基于内存的NoSQL数据库,具有高性能、可扩展性和灵活性等特点。以下是Redis的详细知识点: 安装和启动 * 安装Redis可以通过下载软件包或使用yum、apt-get等安装工具进行安装。 * ...

    Redis学习笔记

    "深入redis学习(十三)--redis applicable scene.doc"最后会分析Redis在缓存、消息队列、计数器、发布订阅等场景中的应用,以及与其他数据库和工具的集成。 通过这些文档的学习,读者可以全面掌握Redis的基础知识...

    Redis学习笔记-包括周阳和狂神说

    在本“Redis学习笔记-包括周阳和狂神说”中,我们将深入探讨Redis的核心概念、功能特性以及实际应用。 1. Redis基本概念 - 键值对:Redis的核心数据结构,键是唯一的标识,值可以是多种类型,如字符串、哈希、列表...

    redis学习笔记。

    此外,Redis 还提供了发布/订阅(pub/sub)功能,支持简单的主从复制和分片,以及丰富的客户端库,使其在各种编程语言中都能方便地使用。 #### 1.2 应用场景 - **缓存**:Redis 可以作为高速缓存,减少数据库的...

    狂神说Redis笔记.pdf

    此外,还有 incr/decr 命令进行原子计数,EXPIRE命令实现数据过期机制,以及PUB/SUB命令支持发布订阅模式。 三、持久化 为了防止数据丢失,Redis提供了两种持久化方式:RDB快照和AOF日志。RDB是在指定时间间隔内...

    Redis学习笔记1

    本文将基于提供的“Redis学习笔记1”内容,详细介绍Redis的安装、启动、单线程特性、发布订阅机制、持久化策略以及AOF和RDB的区别。 1. **Redis安装与启动** Redis的安装通常涉及下载源码包、解压、编译和安装。在...

    2022年redis学习笔记

    这份2022年的Redis学习笔记涵盖了Redis的基础概念、核心特性、使用场景以及最佳实践。 一、Redis简介 Redis是一个开源(BSD许可)的,非关系型、内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它...

    尚硅谷周阳Redis笔记

    以上就是关于"尚硅谷周阳Redis笔记"的一些主要知识点,包括Redis的基本概念、数据类型、持久化、事务、复制、发布订阅、布隆过滤器、HyperLogLog以及GEO定位等功能的介绍。这个笔记资源对于学习和理解Redis的使用...

    redis学习笔记+练习springboot-redisdemo

    本资源包包含了关于Redis的学习笔记以及一个基于SpringBoot整合Redis的实战项目——"springboot-redisdemo",旨在帮助你深入理解和应用Redis。 首先,让我们详细探讨Redis的核心知识点: 1. **Redis的数据类型**:...

    redis学习笔记

    【Redis学习笔记】 Redis是一个基于键值对的高性能NoSql数据库,特别适合处理高并发读写和海量数据的高效存储和访问。Redis以其丰富的数据类型和出色的速度在各种应用场景中得到了广泛的应用。 **NoSql简介** ...

    Redis学习笔记大全

    Redis学习笔记大全 Redis是当前使用最广泛的NoSQL数据库之一,具有高性能、低延迟和支持事务等特点。本文将对Redis的基本概念、安装、启动、关闭、基本命令、5大数据类型、发布和订阅、Bitmaps和HyperLoglog等进行...

    redis学习笔记(Markdown版本)(含目录).zip

    在这个"redis学习笔记(Markdown版本)(含目录)"的压缩包中,你将找到一份详细的学习资料,涵盖了Redis的基础知识到高级应用,帮助你深入理解和掌握这个强大的数据存储工具。 一、Redis基础知识 Redis支持的数据...

Global site tag (gtag.js) - Google Analytics