发布订阅(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版客户端jedis写的。java代码如下:
package com.jd.redis.client;
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPubSub;
publicclass TestPubSubextends JedisPubSub{
@Override publicvoid onMessage(String channel, String message) { System.out.println("onMessage: channel["+channel+"], message["+message+"]"); }
@Override publicvoid onPMessage(String pattern, String channel, String message) { System.out.println("onPMessage: channel["+channel+"], message["+message+"]"); }
@Override publicvoid onSubscribe(String channel,int subscribedChannels) { System.out.println("onSubscribe: channel["+channel+"],"+ "subscribedChannels["+subscribedChannels+"]"); }
@Override publicvoid onUnsubscribe(String channel,int subscribedChannels) { System.out.println("onUnsubscribe: channel["+channel+"], "+ "subscribedChannels["+subscribedChannels+"]"); }
@Override publicvoid onPUnsubscribe(String pattern,int subscribedChannels) { System.out.println("onPUnsubscribe: pattern["+pattern+"],"+ "subscribedChannels["+subscribedChannels+"]"); }
@Override publicvoid onPSubscribe(String pattern,int subscribedChannels) { System.out.println("onPSubscribe: pattern["+pattern+"], "+ "subscribedChannels["+subscribedChannels+"]"); }
publicstaticvoid main(String[] args) { Jedis jr = null; try { jr = new Jedis("192.168.157.128", 6379, 0);//redis服务地址和端口号 TestPubSub sp = new TestPubSub(); sp.proceed(jr.getClient(),"news.share", "news.blog"); //sp.proceedWithPatterns(jr.getClient(), "news.*"); } catch (Exception e) { e.printStackTrace(); } finally{ if(jr!=null){ jr.disconnect(); } } } } |
代码就是用TestPubSub对象来订阅,对象中的那此onXXX方法监听到相应事件
1 首先运行此java程序;
onSubscribe: channel[news.share], subscribedChannels[1] onSubscribe: channel[news.blog], subscribedChannels[2] |
2 启动redis-cli
redis 127.0.0.1:6379> psubscribe news.* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "news.*" 3) (integer) 1 |
3 再启动一个redis-cli用来发布两条消息:
redis 127.0.0.1:6379> publish news.share "share a link http://www.google.com" (integer) 2 redis 127.0.0.1:6379> publish news.blog "I post a blog" (integer) 2 |
4.查看两个订阅client的输出
此时java client打印如下内容:
onMessage: channel[news.share], message[share a link http://www.google.com] onMessage: channel[news.blog], message[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" |
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命令订阅多个通配符通道,如果一个消息匹配上了多个通道模式的话,会多次收到同一个消息。
redis的pub/sub还是有点太单薄(实现才用150行代码)。在安全,认证,可靠性这方便都没有太多支持
相关推荐
Redis全套学习笔记 Redis是一种基于内存的NoSQL数据库,具有高性能、可扩展性和灵活性等特点。以下是Redis的详细知识点: 安装和启动 * 安装Redis可以通过下载软件包或使用yum、apt-get等安装工具进行安装。 * ...
在本“Redis学习笔记-包括周阳和狂神说”中,我们将深入探讨Redis的核心概念、功能特性以及实际应用。 1. Redis基本概念 - 键值对:Redis的核心数据结构,键是唯一的标识,值可以是多种类型,如字符串、哈希、列表...
Redis心得笔记 Redis,全名Remote Dictionary Server,是一款开源、高性能、支持网络、基于键值对的数据存储系统。它常被用作数据库、缓存和消息中间件,因其高效的读写速度和丰富的数据结构而备受青睐。这篇笔记将...
一、 redis 环境搭建 2 二、 redis学习笔记之数据类型 3 三、 redis学习笔记之...六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31
一级分类:基础知识- Redis 数据类型- Redis 命令- Redis 过期策略- Redis 事务- Redis 持久化- Redis 发布订阅- Redis Lua 脚本- Redis 位图操作- Redis 分布式锁- Redis 主从复制- Redis 集群- Redis Sentinel- ...
"深入redis学习(十三)--redis applicable scene.doc"最后会分析Redis在缓存、消息队列、计数器、发布订阅等场景中的应用,以及与其他数据库和工具的集成。 通过这些文档的学习,读者可以全面掌握Redis的基础知识...
它支持多种数据结构,包括字符串(String)、链表(List)、哈希(Hash)、集合(Set)和有序集合(Zset),这些丰富的数据结构使得Redis在缓存、计数、发布订阅系统等多种场景下表现出色。 1. Redis 概述与安装: Redis ...
这个“redis学习笔记.zip”压缩包很可能是包含了关于Redis的学习资料,可能包括概念解释、操作教程、实践案例等内容,适合初学者和有一定基础的学习者参考。 Redis的学习可以分为以下几个主要部分: 1. **基础知识...
这份"redis笔记.rar"包含的"redis笔记.pdf"应该是一份详细的学习指南,非常适合初学者了解和掌握Redis的基本概念、操作命令以及实战技巧。 1. Redis基本概念: - Redis是一个开源的、基于内存的数据存储系统,支持...
此外,Redis 还提供了发布/订阅(pub/sub)功能,支持简单的主从复制和分片,以及丰富的客户端库,使其在各种编程语言中都能方便地使用。 #### 1.2 应用场景 - **缓存**:Redis 可以作为高速缓存,减少数据库的...
本资源包包含了关于Redis的学习笔记以及一个基于SpringBoot整合Redis的实战项目——"springboot-redisdemo",旨在帮助你深入理解和应用Redis。 首先,让我们详细探讨Redis的核心知识点: 1. **Redis的数据类型**:...
01 Redis快速入门 - Redis教程 02-Redis环境安装 - Redis教程 03-Redis 的安装配置介绍 ...13-Redis发布订阅 - Redis教程 。。。 24-Redis Java连接操作 - Redis教程 。。。 27-redis-cluster研究和使用 。。。
Redis学习笔记 Redis是一个开源的基于键值对(Key-Value)NoSQL数据库,使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API。Redis可以被称为KV数据库,键值对数据库,内部存储...
本学习笔记基于GitHub上的项目“Redis-stud”,由JiangRRRen分享,旨在深入理解Redis的设计与实现原理。 一、Redis概述 Redis是Remote Dictionary Server的缩写,它是一个开源的、支持网络的、可持久化的键值存储...
这份2022年的Redis学习笔记涵盖了Redis的基础概念、核心特性、使用场景以及最佳实践。 一、Redis简介 Redis是一个开源(BSD许可)的,非关系型、内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它...
redis学习笔记整理 一、 redis 环境搭建 2 二、 redis学习笔记之数据类型 3...六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31
此外,还有 incr/decr 命令进行原子计数,EXPIRE命令实现数据过期机制,以及PUB/SUB命令支持发布订阅模式。 三、持久化 为了防止数据丢失,Redis提供了两种持久化方式:RDB快照和AOF日志。RDB是在指定时间间隔内...
通过这份Java Redis学习笔记,开发者可以深入了解如何在Springboot项目中高效地利用Redis进行数据存储和处理,提升系统的响应速度和稳定性。同时,配合Markdown格式,便于阅读和整理笔记,而PDF格式则方便离线查阅和...