基于Java环境下的Redis发布订阅的设计与实现
2019-10-20玉绍康关世杰苏一博
玉绍康 关世杰 苏一博
摘 要:随着科学技术的发展,实时聊天系统、微博以及在一些读写分离的分布式架构等应用越来越多,Redis的发布订阅便可以实现这些功能。针对Redis在分布式系统中作为数据通信中间件的问题,本文主要研究了Redis的发布订阅功能。首先简要介绍了Redis的发布订阅功能和机制,然后在基于Java环境下实现了通过Redis的发布订阅功能进行客户机之间的数据通信。
关键词:Redis 数据通信中间件 发布订阅 Java
中图分类号:TP311 文献标识码:A 文章编号:1674-098X(2019)05(b)-0003-02
1 Redis的发布订阅功能
Redis可以作为数据库、缓存服务或消息服务使用,其中内存数据库功能应用最为广泛[1]。但Redis还有许多功能应用也很广泛,例如Redis可作为一种数据通信中间件,即发布订阅功能,应用于实时聊天系统、微博及分布式架构等。
在Redis客户端键入SUBSCRIBE的时候,会建立一个客户端与一个频道的订阅关系,并将所有的频道和客户端的订阅关系都保存在一个叫puhsub_channels的字典中。这个字典的key是某个频道,而values则是一个链表,记录了所有订阅这个频道的客户端[2]。利用Java实现Redis的发布订阅功能可以更好地开发需要通信中间件的Java项目。
2 使用Java实现Redis
Redis是一种缓存数据库,属于客户端和服务端的结构。Java中通常使用 Jedis(客户端)去操作Redis(服务端),首先两者之间要建立连接,在Jedis中,采用 Jedis连接池(Jedispool)建立连接,随时可以从池中取出连接使用[3]。在此基础上,可设计实现Redis发布订阅功能过程如图1所示。
该过程可具体描述如下:
(1)先建立发布者Publisher类,通过频道(mychannel)发布消息。
(2)由于订阅操作机制是线程阻塞的,需要另外开启一个线程(Subscribr类)来专门处理订阅消息和处理接收消息。
(3)发布者和订阅者都通过JedisPool中的getResource()方法从Jedis连接池中取出一个连接,连接Redis服务端。
(4)Jedis中的定义JedisPubSub抽象类可以为Redis提供订阅和取消订阅的功能。此時需要建立消息监听类,这个消息监听类需要继承JedisPubSub类,并重写它的三个方法。当收到消息时,会调用onMessage方法;当订阅频道时,会调用onSubscribe方法;当取消订阅时,会调用onUnsubscribe方法。
3 测试结果
用Java代码设计通信测试类来启动订阅者线程和发布者线程。与此同时订阅者会调用消息监听类中onSubscribe方法实现订阅频道mychannel,订阅结束订阅线程阻塞,并监听此频道的消息。订阅过程如图2所示,可以看出订阅频道成功。
订阅成功后,用键盘输入要发布的消息,发布者线程中的Publisher接收输入的消息后,将消息发布到mychannel中,此时订阅mychannel的订阅者会收到消息并打印,结果如图3所示,可以看出发布端成功发布消息,订阅端已经成功收到消息。
取消订阅需要输入quit命令时,即停止发布消息,同时订阅者调用onUnsubscribe方法取消订阅,结果如图4所示,此时取消订阅成功。
综上所述,本文设计的在Java环境下基于Redis的发布订阅功能有效。
4 结语
Redis技术作为当今应用广泛的技术之一,在各个领域的应用开发中有着不可替代的作用。本文主要研究了Redis的发布订阅功能,在基于Java环境中实现了对频道的订阅、发布、监听、接收功能,通过检测实验的结果成功订阅频道并接收到频道中发布的消息。本文的研究和测试对分布式系统的通信以及信息交互具有重要的意义 。
参考文献
[1] 王嫣如.Redis消息推送机制应用技术研究[J].科技广场,2016(8):41-44.
[2] 黄健宏.Redis设计与实现[M].北京:机械工业出版社,2014.
[3] https://www.cnblogs.com/xinde123/p/8489054.html