Java实现Redis发布订阅消息通信模式

Java实现Redis发布订阅消息通信模式

环境

阿里云ECS
CentOS Linux release 8.1.1911 (Core)
Redis server v=6.0.9
java version "12.0.1" 2019-04-16
IntelliJ IDEA 2020.2.3 (Ultimate Edition)

实现代码

Main

src/com/demo/redis/Main.java

其中,<hostname>为Redis数据库主机名(IP地址),本机为127.0.0.1<password>为Redis登录密码,Redis数据库默认端口为6379

package com.demo.redis;

import redis.clients.jedis.Jedis;

public class Main {
    
    
    private static final String HOST_NAME = "<hostname>";
    private static final String PASSWORD = "<password>";
    private static final int PORT = 6379;// default port

    public static void main(String[] args) {
    
    
        Jedis subscriberJedis = new Jedis(HOST_NAME, PORT);
        subscriberJedis.auth(PASSWORD);
        Jedis publisherJedis = new Jedis(HOST_NAME, PORT);
        publisherJedis.auth(PASSWORD);


        String channel = "channel";

        SubscriberThread subscriberThread = new SubscriberThread(subscriberJedis, channel);
        PublisherThread publisherThread = new PublisherThread(publisherJedis, channel);

        subscriberThread.start();
        publisherThread.start();
    }
}

Subscriber

src/com/demo/redis/Subscriber.java

package com.demo.redis;

import redis.clients.jedis.JedisPubSub;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Subscriber extends JedisPubSub {
    
    
    @Override
    public void onMessage(String channel, String message) {
    
    
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.printf("%s: from channel \"%s\", message: %s\n", simpleDateFormat.format(new Date()), channel, message);
    }

    @Override
    public void onSubscribe(String channel, int subscribedChannels) {
    
    
        System.out.printf("Subscribe channel %s succeed, subscribed channels %d\n", channel, subscribedChannels);
    }

    @Override
    public void onUnsubscribe(String channel, int subscribedChannels) {
    
    
        System.out.printf("Unsubscribe %s succeed, subscribedChannels %d\n", channel, subscribedChannels);
    }
}

PublisherThread

src/com/demo/redis/PublisherThread.java

package com.demo.redis;

import redis.clients.jedis.Jedis;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PublisherThread extends Thread {
    
    
    private Jedis jedis;
    private String channel;

    PublisherThread(Jedis jedis, String channel) {
    
    
        this.jedis = jedis;
        this.channel = channel;
    }

    @Override
    public void run() {
    
    
        try {
    
    
            while (true) {
    
    
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

                jedis.publish(channel, bufferedReader.readLine());
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

SubscriberThread

src/com/demo/redis/SubscriberThread.java

package com.demo.redis;

import redis.clients.jedis.Jedis;

public class SubscriberThread extends Thread {
    
    

    private Jedis jedis;
    private String channel;

    public SubscriberThread(Jedis jedis, String channel) {
    
    
        this.jedis = jedis;
        this.channel = channel;
    }

    @Override
    public void run() {
    
    
        Subscriber subscriber = new Subscriber();
        jedis.subscribe(subscriber, channel);
    }
}

测试结果

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!

猜你喜欢

转载自blog.csdn.net/qq_44486439/article/details/111460935