Jedis的Publish/Subscribe功能的运用

023_Jedis的发布和订阅 1.Redis为我们提供了publish/subscribe(发布/订阅)功能。我们可以对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布)消息时, Redis就会通知我们, 这样我们可以收到别人发布的消息。 2. 作为Java的Redis客户端, Jedis提供了publish/subscribe的接口。本文讲述如何使用Jedis来实现Redis的publish/subscribe。 3. Jedis定义了抽象类JedisPubSub, 在这. 阅读详情

个人学习参考所用,勿喷!感谢同事ryu的帮助!!

 

一、Redis服务器端的安装和客户端Jedis的安装

1.下载Redis

   下载地址:http://redis.googlecode.com/files/redis-2.4.8.tar.gz

 

2.安装Redis

在linux下运行如下命令进行安装。

Shell代码   收藏代码
  1. $ tar xzf redis-2.4.8.tar.gz  
  2. $ cd redis-2.4.8  
  3. $ make  

make完后 redis-2.4.8目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli。下面启动redis服务.

Shell代码   收藏代码
  1. $./redis-server  

注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动.

Shell代码   收藏代码
  1. $ ./redis-server redis.conf  

 redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了.比如

Shell代码   收藏代码
  1. $ ./redis-cli  
  2. redis> set foo bar  
  3. OK  
  4. redis> get foo  
  5. "bar"  

这里演示了get和set命令操作简单类型value的例子。foo是key ,bar是个string类型的value。没linux的可以通过这个在线的来练习,当然在线版的很多管理相关的命令是不支持的。http://try.redis-db.com/

 

3.测试安装

Jedis是官方推荐的连接redis的客户端,客户端jar包地址:http://cloud.github.com/downloads/xetorthio/jedis/jedis-2.0.0.jar。

在eclipse中新建一个java项目,然后添加jredis包引用。或者可以创建Maven项目,导入jedis代码如下

Xml代码   收藏代码
  1. <dependency>  
  2.     <groupId>redis.clients</groupId>  
  3.     <artifactId>jedis</artifactId>  
  4.     <version>2.0.0</version>  
  5.     <type>jar</type>  
  6.     <scope>compile</scope>  
  7. </dependency><span style="background-color: #ffffff;">    </span>  

下面是个hello,world程序

Java代码   收藏代码
  1. package demo;  
  2. import org.jredis.*;  
  3. import org.jredis.ri.alphazero.JRedisClient;  
  4. public class App {  
  5. public static void main(String[] args) {  
  6. try {  
  7.              JRedis  jr = new JRedisClient("*.*.*.*",6379); //redis服务地址和端口号  
  8.              String key = "mKey";  
  9.              jr.set(key, "hello,redis!");  
  10.              String v = new String(jr.get(key));  
  11.              String k2 = "count";  
  12.              jr.incr(k2);  
  13.              jr.incr(k2);  
  14.              System.out.println(v);  
  15.              System.out.println(new String(jr.get(k2)));  
  16.         } catch (Exception e) {  
  17.   
  18.         }  
  19.     }  
  20. }   

运行测试客户端,如果能够看到正确的输出,那么redis环境已经搭建好了。

 

二、Jedis的Publish/Subscribe功能的使用

由于redis内置了发布/订阅功能,可以作为消息机制使用。所以这里主要使用Jedis的Publish/Subscribe功能。

 

1.添加Spring核心包,主要使用其最核心的IoC功能。如果使用Maven,配置如下:

Xml代码   收藏代码
  1. <dependency>  
  2.     <groupId>org.springframework</groupId>  
  3.     <artifactId>spring-context</artifactId>  
  4.     <version>3.1.1.RELEASE</version>  
  5.     <type>jar</type>  
  6.     <scope>compile</scope>  
  7. </dependency>  
  8. <dependency>  
  9.     <groupId>org.springframework</groupId>  
  10.     <artifactId>spring-context-support</artifactId>  
  11.     <version>3.1.1.RELEASE</version>  
  12.     <type>jar</type>  
  13.     <scope>compile</scope>  
  14. </dependency>  
  15. <dependency>  
  16.     <groupId>org.springframework</groupId>  
  17.     <artifactId>spring-beans</artifactId>  
  18.     <version>3.1.1.RELEASE</version>  
  19.     <type>jar</type>  
  20.     <scope>compile</scope>  
  21. </dependency>  
  22. <dependency>  
  23.     <groupId>org.springframework</groupId>  
  24.     <artifactId>spring-core</artifactId>  
  25.     <version>3.1.1.RELEASE</version>  
  26.     <type>jar</type>  
  27.     <scope>compile</scope>  
  28. </dependency>  
 

 

2.使用Spring来配置Jedis连接池和RedisUtil的注入,写在bean-config.xml中。

Xml代码   收藏代码
  1. <!-- pool配置 -->  
  2. <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">  
  3.     <property name="maxActive" value="20" />  
  4.     <property name="maxIdle" value="10" />  
  5.     <property name="maxWait" value="1000" />  
  6.     <property name="testOnBorrow" value="true" />  
  7. </bean>  
  8. <!-- jedis pool配置 -->  
  9. <bean id="jedisPool" class="redis.clients.jedis.JedisPool">  
  10.     <constructor-arg index="0" ref="jedisPoolConfig" />  
  11.     <constructor-arg index="1" value="10.8.9.237" />  
  12.     <constructor-arg index="2" value="6379" />  
  13. </bean>  
  14. <!-- 包装类 -->  
  15. <bean id="redisUtil" class="demo.RedisUtil">  
  16.     <property name="jedisPool" ref="jedisPool" />  
  17. </bean>  

 

3.编写RedisUtil,这里只是简单的包装,不做解释。

 

Java代码   收藏代码
  1. package demo;  
  2.   
  3. import redis.clients.jedis.Jedis;  
  4. import redis.clients.jedis.JedisPool;  
  5.   
  6.   
  7. /**   
  8.  * 连接和使用redis资源的工具类     
  9.  * @author watson    
  10.  * @version 0.5    
  11.  */   
  12. public class RedisUtil {  
  13.       
  14.     /**        
  15.      * 数据源       
  16.      */       
  17.     private JedisPool jedisPool;  
  18.       
  19.     /**       
  20.      * 获取数据库连接        
  21.      * @return conn        
  22.      */       
  23.     public Jedis getConnection() {  
  24.         Jedis jedis=null;            
  25.         try {                
  26.             jedis=jedisPool.getResource();            
  27.         } catch (Exception e) {                
  28.             e.printStackTrace();            
  29.         }            
  30.         return jedis;        
  31.     }     
  32.       
  33.     /**        
  34.      * 关闭数据库连接        
  35.      * @param conn        
  36.      */       
  37.     public void closeConnection(Jedis jedis) {            
  38.         if (null != jedis) {                
  39.             try {                    
  40.                 jedisPool.returnResource(jedis);                
  41.             } catch (Exception e) {  
  42.                     e.printStackTrace();                
  43.             }            
  44.         }        
  45.     }    
  46.       
  47.     /**        
  48.      * 设置连接池        
  49.      * @param 数据源       
  50.      */       
  51.     public void setJedisPool(JedisPool JedisPool) {  
  52.         this.jedisPool = JedisPool;        
  53.     }         
  54.       
  55.     /**        
  56.      * 获取连接池        
  57.      * @return 数据源        
  58.      */       
  59.     public JedisPool getJedisPool() {  
  60.         return jedisPool;        
  61.     }       
  62. }   
 

 

4.编写Lister

要使用Jedis的Publish/Subscribe功能,必须编写对JedisPubSub的自己的实现,其中的函数的功能如下:

Java代码   收藏代码
  1. package demo;  
  2.   
  3. import redis.clients.jedis.JedisPubSub;  
  4.   
  5. public class MyListener extends JedisPubSub {  
  6.     // 取得订阅的消息后的处理  
  7.     public void onMessage(String channel, String message) {  
  8.         System.out.println(channel + "=" + message);  
  9.     }  
  10.   
  11.     // 初始化订阅时候的处理  
  12.     public void onSubscribe(String channel, int subscribedChannels) {  
  13.         // System.out.println(channel + "=" + subscribedChannels);  
  14.     }  
  15.   
  16.     // 取消订阅时候的处理  
  17.     public void onUnsubscribe(String channel, int subscribedChannels) {  
  18.         // System.out.println(channel + "=" + subscribedChannels);  
  19.     }  
  20.   
  21.     // 初始化按表达式的方式订阅时候的处理  
  22.     public void onPSubscribe(String pattern, int subscribedChannels) {  
  23.         // System.out.println(pattern + "=" + subscribedChannels);  
  24.     }  
  25.   
  26.     // 取消按表达式的方式订阅时候的处理  
  27.     public void onPUnsubscribe(String pattern, int subscribedChannels) {  
  28.         // System.out.println(pattern + "=" + subscribedChannels);  
  29.     }  
  30.   
  31.     // 取得按表达式的方式订阅的消息后的处理  
  32.     public void onPMessage(String pattern, String channel, String message) {  
  33.         System.out.println(pattern + "=" + channel + "=" + message);  
  34.     }  
  35. }  
 

  5.实现订阅动能

Jedis有两种订阅模式:subsribe(一般模式设置频道)和psubsribe(使用模式匹配来设置频道)。不管是那种模式都可以设置个数不定的频道。订阅得到信息在将会lister的onMessage(...)方法或者onPMessage(...)中进行进行处理,这里我们只是做了简单的输出。

Java代码   收藏代码
  1. ApplicationContext ac = new ClassPathXmlApplicationContext("beans-config.xml"); 
  2. RedisUtil ru = (RedisUtil) ac.getBean("redisUtil");   
  3. final Jedis jedis = ru.getConnection();  
  4. final MyListener listener = new MyListener();  
  5. //可以订阅多个频道  
  6. //订阅得到信息在lister的onMessage(...)方法中进行处理  
  7. //jedis.subscribe(listener, "foo", "watson");  
  8.   
  9. //也用数组的方式设置多个频道  
  10. //jedis.subscribe(listener, new String[]{"hello_foo","hello_test"});  
  11.   
  12. //这里启动了订阅监听,线程将在这里被阻塞  
  13. //订阅得到信息在lister的onPMessage(...)方法中进行处理  
  14. jedis.psubscribe(listener, new String[]{"hello_*"});//使用模式匹配的方式设置频道  
 

6.实现发布端代码

发布消息只用调用Jedis的publish(...)方法即可。

 

Java代码   收藏代码
  1. ApplicationContext ac = new ClassPathXmlApplicationContext("beans-config.xml");  
  2. RedisUtil ru = (RedisUtil) ac.getBean("redisUtil");   
  3. Jedis jedis = ru.getConnection();  
  4. jedis.publish("hello_foo", "bar123");  
  5. jedis.publish("hello_test", "hello watson");  
 

 

7.分别运行上面的第5步的订阅端代码和第6步的发布端的代码,订阅端就可以得到发布端发布的结果。控制台输出结果如下:

 

输出代码   收藏代码
  1. hello_*=hello_foo=bar123  
  2. hello_*=hello_test=hello watson  

 

 

至此Jedis的Publish/Subscribe功能的使用基本展示完成,该使用方法稍作完善和修改后即可用于生产环境。

 

redis的安装参考:

  1. 官方:http://redis.io/topics/quickstart
  2. 中文:http://www.cnblogs.com/redcreen/archive/2011/02/15/1955523.html

参考:

  1. Jedis的高级使用:https://github.com/xetorthio/jedis/wiki/AdvancedUsage
  2. netty里集成spring注入jedis:http://yifangyou.blog.51cto.com/900206/628163
  3. Redis的Publish/Subscribe命令的使用:http://redis.io/topics/pubsub
  4. Redis的使用:http://redis.io/
Unity 2022.3.3 LTS + Visual Studio 2022:手把手教你复刻《吸血鬼幸存者》核心战斗(附完整项目源码) 本文详细介绍了如何使用Unity 2022.3.3 LTS和Visual Studio 2022从零构建《吸血鬼幸存者》式战斗系统。通过图文开发教程,涵盖对象池优化、ECS架构雏形、2D物理碰撞控制等关键技术,帮助开发者高效复刻这款热门游戏的自动攻击与海量刷怪机制。 阅读详情

相关推荐

UE4项目迁移指南:如何无缝导入外部.uasset文件并保持材质关联

本文详细解析了将外部.uasset文件无缝导入UE4项目的专业方法。针对手动复制文件时常见的材质关联丢失问题,提供了使用引用查看器进行诊断和修复的实用技巧,并推荐使用引擎内置的“迁移”功能确保资源依赖关系的完整性,帮助开发者高效整合项目资源。

t8u9v0的博客 1046

Redis发布订阅模式(publish/subscribe)

目录 一、概念 二、原理 三、推送的消息格式 四、发布订阅命令 1.发送消息 2.订阅频道 3.模式匹配 4.取消订阅 五、使用Jedis发布订阅命令 六、缺点 七、参考文档 一、概念 Redis发布/订阅(Pub/Sub)是一种通信机制,将数据推到某个信息管道中,其他客户端可通过订阅这些管道来获取推送信息,以此用于消息的传输。 由三部分组成:发布者(Publisher)、频道(Channel)、订阅者(Subscriber)。 发布者发布的消息分...

Jason_Dom的博客 1万+

MATLAB图像去噪实战:如何用巴特沃斯滤波器完美去除横条纹(附完整代码)

本文详细介绍了如何使用MATLAB中的巴特沃斯滤波器有效去除图像中的横条纹噪声。通过频域分析和滤波处理,结合完整的代码示例,帮助读者掌握从噪声分析到参数优化的全流程技术,实现高质量的图像去噪效果。

weixin_30566063的博客 564

Jedis的Publish/Subscribe功能的使用

redis内置了发布/订阅功能,可以作为消息机制使用。所以这里主要使用Jedis的Publish/Subscribe功能。 1、使用Spring来配置Jedis连接池 <!-- pool配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxActive" value="20" /> <property name

Dancer_AI的博客 2160

linux下redhat6.8(理论是都适用)安装oracle12c---详细教程

1、配置yum源 1)、删除Redhat自带的yum: (2)、上传centos的yum包,并按照顺序安装,所需的rpm包通过点击这里获取(放在oracle文件中的centos yum):上传到linux中 进行安装 yum包链接:https://pan.baidu.com/s/1TxciCWEd7d-d4kGoea0L1w 提取码:eufp `` --注意后面两个安装包一起安装 ## 3)、更改系统yum源: 编辑rhel-source.repo文件,将其中的$releas

z931407229的博客 1149

AUTOSAR进阶图解==>AUTOSAR_SWS_CANStateManager

AUTOSAR CAN状态管理器(CanSM)摘要 CanSM是AUTOSAR通信栈中的关键模块,负责管理CAN网络状态和模式转换。主要功能包括: 控制CAN控制器/收发器工作模式(STARTED/STOPPED,NORMAL/STANDBY) 处理三种网络状态(全通信、静默通信、无通信)之间的转换 监控和处理总线关闭(Bus-Off)事件 与ComM、CanIf、BswM等模块协同工作 CanSM通过状态机管理网络状态转换,支持可配置的总线关闭恢复策略。它为每个CAN网络维护独立的状态机,实现网络状态的精

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 5582

java redid订阅,Jedis的Publish/Subscribe功能的运用 | 学步园

个人学习参考所用,勿喷!感谢同事ryu的帮助!!一、Redis服务器端的安装和客户端Jedis的安装1.下载Redis2.安装Redis在linux下运行如下命令进行安装。Shell代码$tarxzfredis-2.4.8.tar.gz$cdredis-2.4.8$makemake完后 redis-2.4.8目录下会出现编译后的redis服务程序redis-server,还有用于测...

weixin_29165725的博客 514

YOLO26改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头

本文记录的是基于移动倒置瓶颈 MBConv 的 YOLO26 的检测头轻量化改进方法研究。采用了独特的倒置瓶颈结构,通过的操作以及,在高效提取特征的同时极大地降低了计算量。本文将的设计优势融入j检测头中,使其在目标检测任务中不仅能够更精准地识别各类目标,还能在计算资源有限的情况下快速响应,展现出更为卓越的实时检测能力。EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks的实现代码如下: 首先在代码中加入如下代码: 其

Limiiiing的博客 292

Jedis实现Publish/Subscribe功能

Redis为我们提供了publish/subscribe(发布/订阅)功能。我们可以对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布)消息时,redis就会通知我们,这样我们可以收到别人发布的消息。 作为Java的redis客户端,Jedis提供了publish/subscribe的接口。本文讲述如何使用jedis来实现redis的pub

Leo的博客 4万+

FPGA&ASIC笔面试题(四):编写Verilog代码描述跨时钟域信号传输,快时钟域到慢时钟域(补充)

      跨时钟域处理从快时钟域到慢时钟域,如果是下面第一个图,cklb则可以采样到signal_a_in,但是如果只有单脉冲,如第二个图,则不能确保采样掉signal_a_in。这个时候用两级触发器同步是没有用的。 代码如下: //Synchronous module Sync_Pulse( input clka, input clkb, input rst_n, input pulse_ina, output pulse_outb, ou

千歌叹尽执夏的博客 2511

提示工程从初级到高级:如何评估提示词的鲁棒性?架构师分享测试方法

鲁棒性(Robustness)原本是工程领域的概念,指系统在“非理想条件”下保持性能稳定的能力。输入鲁棒性:面对不规范、有噪音、格式变异的用户输入,提示能否引导模型输出正确结果?模型鲁棒性:同一提示在不同大模型(或同一模型的不同版本)下,输出是否一致?场景鲁棒性:在边界场景(极端case、歧义case、多任务混合)下,提示能否保持逻辑一致性?提示词V1:请将以下用户评论分类为「正面」「中性」或「负面」:{comment}。要求:输出唯一类别,不要额外说明。

小程序开发 497

jedis的publish/subscribe

首先使用redis客户端来进行publish与subscribe的功能是否能够正常运行。  打开redis服务器 [root@localhost ~]# redis-server /opt/redis-2.4.10/redis.conf  [7719] 16 Apr 11:37:22 # Warning: 32 bit instance detected but no memory limit

pestd‘s blog 5334

车载ECU底软测试:方法与技术的深度解析

底软是运行在 ECU 硬件平台上的基础软件,它为上层应用程序提供了硬件驱动、操作系统服务、通信协议栈等功能。底软的主要功能包括:硬件驱动:负责与 ECU 的各种硬件外设进行通信和控制,如 GPIO、UART、SPI、CAN 等。操作系统服务:提供任务调度、内存管理、中断处理等功能,确保系统的实时性和稳定性。通信协议栈:实现 ECU 与其他 ECU 或外部设备之间的通信,如 CAN、LIN、FlexRay 等。诊断服务:负责对 ECU 的故障进行诊断和处理,并将故障信息存储在故障码存储器中。

天赐好车的博客 1429

redis jedis实现发布/订阅功能

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34419326的博客 778

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Redis: Jedis中publish/subscribe 使用

在Redis早期版本就已经提供publish/subscribe 模式,该文使用Jedis客户端的一个小例子.   Jedis 类中提供: 在Jedis中提供 发布二进制编码 ,string字符串 以及pattern匹配模式三种方式来发布publish消息.   public Long publish(final String channel, final String message)

sunning9001的专栏 5805

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 用Redis bitmap统计活跃用户、留存
下一篇: 关于类微博的timeline的设计思考
codepython
博客等级 码龄20年 125粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值