List实现

MessageProvider

package com.sdkj;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * @Author wangshuo
 * @Date 2022/4/24, 17:34
 * 消息生产者
 */
public class MessageProvider extends Thread {

    public static final String MESSAGE_KEY = "message:queue";
    private volatile int count;

    public void putMessage(String message) {

        JedisClientConfig jedisClientConfig = new JedisClientConfig();
        JedisPool jedisPool = jedisClientConfig.getJedisPool();
        Jedis jedis = jedisClientConfig.getJedis(jedisPool);
        Long size = jedis.lpush(MESSAGE_KEY, message);
        System.out.println(Thread.currentThread().getName() + " put message, size = " + size + ", count = " + count);
        count++;
        //close
        jedisClientConfig.closeJedisAndJedisPool(jedisPool, jedis);
    }

    @Override
    public synchronized void run() {

        for (int i = 0; i < 5; i++) {

            putMessage("message" + count);
        }
    }

    public static void main(String[] args) {

        MessageProvider messageProvider = new MessageProvider();
        Thread thread1 = new Thread(messageProvider, "Thread1");
        Thread thread2 = new Thread(messageProvider, "Thread2");
        Thread thread3 = new Thread(messageProvider, "Thread3");
        Thread thread4 = new Thread(messageProvider, "Thread4");
        Thread thread5 = new Thread(messageProvider, "Thread5");
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();
    }
}

MessageConsumer

package com.sdkj;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

/**
 * @Author wangshuo
 * @Date 2022/4/24, 17:59
 * 消息生产者
 */
public class MessageConsumer implements Runnable {

    public static final String MESSAGE_KEY = "message:queue";
    private volatile int count;

    public void consumerMessage() {

        JedisClientConfig jedisClientConfig = new JedisClientConfig();
        JedisPool jedisPool = jedisClientConfig.getJedisPool();
        Jedis jedis = jedisClientConfig.getJedis(jedisPool);
        List<String> rpop = jedis.brpop(0, MESSAGE_KEY);
        System.out.println(rpop);
        System.out.println(Thread.currentThread().getName() + " consumer message, message = " + rpop.get(1) + ", count = " + count);
        count++;
        jedisClientConfig.closeJedisAndJedisPool(jedisPool, jedis);
    }

    @Override
    public void run() {

        while (true) {
            consumerMessage();
        }
    }

    public static void main(String[] args) {

        MessageConsumer messageConsumer = new MessageConsumer();
        Thread thread6 = new Thread(messageConsumer, "thread6");
        Thread thread7 = new Thread(messageConsumer, "thread7");
        thread6.start();
        thread7.start();
    }
}

订阅者模式

MessageProvider

package com.sdkj.ding_yue_zhe;

import com.sdkj.JedisClientConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * @Author wangshuo
 * @Date 2022/4/24, 19:26
 * 订阅者模式 / 生产者
 */
public class MessageProvider extends Thread {

    public static final String CHANNEL_KEY = "channel:ws";
    private volatile int count;
    private static JedisClientConfig jedisClientConfig = new JedisClientConfig();

    public void putMessage(String message) {
        JedisPool jedisPool = jedisClientConfig.getJedisPool();
        Jedis jedis = jedisClientConfig.getJedis(jedisPool);
        //返回订阅者数量
        Long publish = jedis.publish(CHANNEL_KEY, message);
        System.out.println(Thread.currentThread().getName() + " put message , count = " + count + " , subscriberNum = " + publish);
        count++;
        jedisClientConfig.closeJedisAndJedisPool(jedisPool, jedis);
    }

    @Override
    public synchronized void run() {
        for (int i = 0; i < 5; i++) {
            putMessage("message" + count);
        }
    }

    public static void main(String[] args) {
        MessageProvider messageProvider = new MessageProvider();
        Thread thread1 = new Thread(messageProvider, "thread1");
        Thread thread2 = new Thread(messageProvider, "thread2");
        Thread thread3 = new Thread(messageProvider, "thread3");
        Thread thread4 = new Thread(messageProvider, "thread4");
        Thread thread5 = new Thread(messageProvider, "thread5");
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();
    }
}

MessageConsumer.java

package com.sdkj.ding_yue_zhe;

import com.sdkj.JedisClientConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPubSub;

/**
 * @Author wangshuo
 * @Date 2022/4/24, 19:35
 * 订阅者模式 / 消费者
 */
public class MessageConsumer implements Runnable {

    public static final String CHANNEL_KEY = "channel:ws";
    public static final String EXIT_COMMAND = "exit";
    private static JedisClientConfig jedisClientConfig = new JedisClientConfig();
    //Subscribe模式
    private MyJedisPubSubscribe myJedisPubSub = new MyJedisPubSubscribe();
    //PSubscribe模式
    private MyJedisPubPSubscribe myJedisPubSubscribe = new MyJedisPubPSubscribe();

    @Override
    public void run() {
        while (true) {
            consumerMessage();
        }
    }

    private void consumerMessage() {

        JedisPool jedisPool = jedisClientConfig.getJedisPool();
        Jedis jedis = jedisClientConfig.getJedis(jedisPool);
        //jedis.subscribe(myJedisPubSub, CHANNEL_KEY);
        jedis.psubscribe(myJedisPubSubscribe, CHANNEL_KEY);
        jedisClientConfig.closeJedisAndJedisPool(jedisPool, jedis);
    }

    public static void main(String[] args) {
        MessageConsumer messageConsumer = new MessageConsumer();
        Thread thread6 = new Thread(messageConsumer, "thread6");
        Thread thread7 = new Thread(messageConsumer, "thread7");
        thread6.start();
        thread7.start();
    }
}

//重写JedisPubSub
class MyJedisPubSubscribe extends JedisPubSub {

    @Override
    public void onMessage(String channel, String message) {

        System.out.println(Thread.currentThread().getName() + "-接收到消息 :channel = " + channel + " message = " + message);
        //接收到exit消息后退出
        if (MessageConsumer.EXIT_COMMAND.equals(message))
            System.exit(0);
    }
}

//重写JedisPubSub
class MyJedisPubPSubscribe extends JedisPubSub {

    @Override
    public void onPMessage(String pattern, String channel, String message) {

        System.out.println(Thread.currentThread().getName() + "-接收到消息 :pattern = " + pattern + " channel = " + channel + " message = " + message);
        //接收到exit消息后退订并退出
        if (MessageConsumer.EXIT_COMMAND.equals(message)) {
            unsubscribe(MessageConsumer.CHANNEL_KEY);
            System.exit(0);
        }
    }

    @Override
    public void unsubscribe(String... channels) {
        super.unsubscribe(channels);
    }
}