Redis 订阅发布_Jedis实现方法
我想到使用Redis的订阅发布模式是用来解决推送问题的~。
对于概念性的叙述,多多少少还是要提一下的:
什么是Redis发布订阅?Redis发布订阅是一种消息通信模式,发送者通过通道A发送消息message,订阅过通道A的客户端就可以接收到消息message。嗯度娘上面的解释要比我所说的好多了,而我所理解的就是:所谓的订阅发布模式,其实和我们看电视,听广播差不多,在我们没有调台(换频道)的时候,那个频道也是在传递消息的(发布)。我们换到那个频道上(订阅)就能接收到消息了。是的,虽然可能有些不恰当~
说明
本文中示例采用了三个客户端,以“品”字形排列,由上至下,由左至右分别为客户端1(c1),客户端2(c2),客户端3(c3).特此说明。
Redis订阅与发布命令
首先声明,有关Redis服务器的搭建工作,请自行查阅相关资料进行环境抢建
听说Redis中发布与订阅只有简单的6个命令。即:
PSUBSCRIBEpattern[pattern...]
订阅一个或者多个符合pattern格式的频道
PUBLISHchannelmessage
发布消息到chanel中
PUBSUBsubcommand[argument[argument...]]
查看订阅与发布系统状态
PUNSUBSCRIBE[pattern[pattern...]]
退订所有符合格式的频道
SUBSCRIBEchannel[channel...]
订阅一个或者多个频道
UNSUBSCRIBE[channel[channel...]]
取消订阅频道
例1-SUBSCRIBE
连接redis后键入命令
SUBSCRIBEstudy
这样便订阅了一个名为study的频道。
接下来study频道要发消息啦。~~
例2-PUBLISH
另开启一个客户端,我使用的是品字形布局的最上面那个做为发布者,键入
PUBLISHstudy"message1-gogogo"
可以看到,当客户端1在study频道发布消息时,客户端2(已订阅study频道)可以接收到c1发布的消息,而客户端3由于没有订阅study频道,所以接收不到c1发送的消息。
例3-PSUBSCRIBE
现在,跟着博主左手,右手一个慢动作。在c3中键入
PSUBSCRIBEstudy*
OK,现在在c1中键入
PUBLISHstudy"message2"
上结果图:
c3采用的通配符的形式,也将study频道给订阅成功了。
接下来,在c1中继续键入命令:
PUBLISHstudy:java"Ihatejavaforever"
可以看到,使用psubscribe不仅将study频道订阅了,而且将以study为首的频道也订阅了。
例4-PUBSUB
在c1中键入pubsubchannel,可以获得:
127.0.0.1:6379>PUBSUBchannels 1)"study"
意为当前正在活跃的频道。
Jedis实现订阅发布者模式
好了,上面通过命令行熟悉了一下Redis中有关订阅发布者模式的相关命令。下面我们要将redis的订阅与发布者嵌入到项目中。
首先,我们使用jedis先订阅一个名为:study的频道
然后我们先从命令行处进行消息发布:
之后,我们使用jedis在项目中进行消息发布:
我们可以进行正常的通信~噢耶~
核心代码:
PublishMessage.java用于开启一个发布消息的线程
privateLoggerlogger=LoggerFactory.getLogger(PublishMessage.class); @Resource privateJedisClusterjedisCluster; /** *发布消息 * *@paramchannel频道 *@parammessage信息 */ publicvoidsendMessage(finalStringchannel,finalStringmessage){ Threadthread=newThread(()->{ Longpublish=jedisCluster.publish(channel,message); logger.info("服务器在:{}频道发布消息{}-{}",channel,message,publish); }); logger.info("发布线程启动:"); thread.setName("publishThread"); thread.start(); }
ChatSubscribe.java用于处理订阅相关事件,继承自JedisPubSub
privateLoggerlogger=LoggerFactory.getLogger(ChatSubscribe.class); //取得订阅的消息后的处理 @Override publicvoidonMessage(Stringchannel,Stringmessage){ logger.info("订阅成功,接收到的消息为:频道-{},消息-{}",channel,message); RedisString.message=message; } //取得按表达式的方式订阅的消息后的处理 @Override publicvoidonPMessage(Stringpattern,Stringchannel,Stringmessage){ System.out.println("-----取得按表达式的方式订阅的消息后的处理-----"); System.out.println(pattern+"="+channel+"="+message); } //初始化按表达式的方式订阅时候的处理 @Override publicvoidonPSubscribe(Stringpattern,intsubscribedChannels){ System.out.println("-----初始化按表达式的方式订阅时候的处理-----"); System.out.println(pattern+"="+subscribedChannels); } //取消按表达式的方式订阅时候的处理 @Override publicvoidonPUnsubscribe(Stringpattern,intsubscribedChannels){ System.out.println("-----取消按表达式的方式订阅时候的处理-----"); System.out.println(pattern+"="+subscribedChannels); } @Override publicvoidonPong(Stringpattern){ super.onPong(pattern); } //初始化订阅时候的处理 @Override publicvoidonSubscribe(Stringchannel,intsubscribedChannels){ logger.info("初始化订阅信息:频道-{},订阅频道-{}",channel,subscribedChannels); } //取消订阅时候的处理 @Override publicvoidonUnsubscribe(Stringchannel,intsubscribedChannels){ logger.info("已取消订阅频道{}",channel); }
SubScribeMessage.java订阅频道,取消频道等动作类
privateLoggerlogger=LoggerFactory.getLogger(SubScribeMessage.class); privateExecutorServicecachedThreadPool=Executors.newCachedThreadPool(); @Resource privateJedisClusterjedisCluster; /** *订阅频道 * *@paramchannel频道 *@paramroomSubListerner */ publicvoidsubscribeChannel(finalStringchannel,finalChatSubscriberoomSubListerner){ cachedThreadPool.execute(newRunnable(){ @Override publicvoidrun(){ jedisCluster.subscribe(roomSubListerner,channel); } }); } jedisCluster是否封装工具类,取自各位看官,核心代码已给出,请各位看官根据自身业务与逻辑,自行更改与优化代码。 本次示例程序采用tomcat9.0+spring+springmvc 使用了诸如:@RestController,@GetMapping等相关注解,便于开发,有兴趣可自行查阅spring相关资料。
以上这篇Redis订阅发布_Jedis实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。