Redis上的操作:
打开两个窗口,打开redis客户端:
一个客户端:订阅(客户端订阅channel1频道):127.0.0.1:6379> subscribe channel1
另一个客户端:发布(客户端向channel1频道发送消息hello):127.0.0.1:6379> publish channel1 hello
Java代码实现
1: 先创建一个订阅消息处理类
/*** 订阅消息处理类** @version 1.0* @date 2022/05/26 15:51:11*/
public class Subscriber extends JedisPubSub {public Subscriber(){}//收到消息会调用@Overridepublic void onMessage(String channel, String message) {System.out.println("接收 redis 发布的消息, 频道为:" + channel + ", 消息内容是:" + message);}//订阅了频道会调用@Overridepublic void onSubscribe(String channel, int subscribedChannels) {System.out.println("订阅 redis 频道成功, 频道是:" + channel + ", 订阅频道数量是:" + subscribedChannels);}//取消订阅 会调用@Overridepublic void onUnsubscribe(String channel, int subscribedChannels) {System.out.println("取消订阅 redis 频道,频道:" + channel + ", 订阅频道:" + subscribedChannels);}
}
2: 创建消息的发布者
/*** 消息的发布者** @version 1.0* @date 2022/05/26 15:43:06*/
public class SmsPublisher extends Thread {private final JedisPool jedisPool;public SmsPublisher(JedisPool jedisPool) {this.jedisPool = jedisPool;}@Overridepublic void run() {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//连接池中取出一个连接Jedis jedis = jedisPool.getResource();while (true) {try {//向 xyzChannel 的频道上推送消息Long smsNumber = jedis.publish("xyzChannel", reader.readLine());System.out.println("消息的发布者:发布成功,当前向xyzChannel频道发送的消息数量为:" + smsNumber);} catch (IOException e) {e.printStackTrace();}}}}
3: 创建消息订阅者
/*** 消息订阅者** @version 1.0* @date 2022/05/26 15:49:47*/
public class SmsSubscriber extends Thread{private final JedisPool jedisPool;private final Subscriber subscriber = new Subscriber();//频道private final String channel = "xyzChannel";public SmsSubscriber(JedisPool jedisPool) {super("SmsSubscriber");this.jedisPool = jedisPool;}@Overridepublic void run() {System.out.println("订阅Redis频道,频道为:" + channel + ", 等待消息发送者发送消息(请在控制台输入消息内容)...");Jedis jedis = null;try {//取出一个连接jedis = jedisPool.getResource();//通过subscribe的api去订阅频道,入参是订阅者和频道名jedis.subscribe(subscriber, channel);} catch (Exception e) {System.out.println("消息订阅者订阅消息出现异常: " + e.getMessage());} finally {if (jedis != null) {jedis.close();}}}
}
4: Redis消息的发布和订阅测试类
/*** Redis消息的发布和订阅测试类** @version 1.0* @date 2022/05/26 16:01:56*/
public class SmsTest {public static void main(String[] args) {// 连接本地redis服务端JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);//消息的发布者SmsPublisher publisher = new SmsPublisher(jedisPool);publisher.start();//消息的订阅者SmsSubscriber subscriber = new SmsSubscriber(jedisPool);subscriber.start();}
}
运行结果