redis的发布、订阅模式

版权声明: https://blog.csdn.net/xichengqc/article/details/88421299

发布、订阅模式可以用于实现聊天功能,首先我们通过一个简单demo来认识一下redis的发布订阅功能
代码git地址:https://github.com/xichengxml/woodencottage/tree/master/190312-redis

  1. redis下载安装,安装windows版即可:https://github.com/MSOpenTech/redis/releases
  2. 添加pom文件
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
  1. 发布者,从控制台读取信息,实时发布出去
package com.xicheng.redis.pubsub;

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

import java.util.Scanner;

/**
 * @author xichengxml
 * @date 2019/3/12 13:53
 */
public class Publisher extends Thread {

    private JedisPool jedisPool;

    public Publisher(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }

    @Override
    public void run() {
        Scanner scanner = new Scanner(System.in);
        // 从连接池中取出一个连接
        Jedis jedis = jedisPool.getResource();
        while (true) {
            System.out.println("Pls input something(input q to quit): ");
            String line = scanner.nextLine();
            if ("q".equals(line)) {
                break;
            }
            jedis.publish("mychannel", line);
        }
    }
}
  1. 订阅者,监听订阅、新消息、取消订阅
package com.xicheng.redis.pubsub;

import redis.clients.jedis.JedisPubSub;

/**
 * @author xichengxml
 * @date 2019/3/12 13:59
 */
public class Subscriber extends JedisPubSub {

    @Override
    public void onMessage(String channel, String message) {
        System.out.println("Message received, channel:" + channel + ", message:" + message);
    }

    @Override
    public void onSubscribe(String channel, int subscribedChannels) {
        System.out.println("Subscribe success, channel:" + channel + ", subscribedChannels:" + subscribedChannels);
    }

    @Override
    public void onUnsubscribe(String channel, int subscribedChannels) {
        System.out.println("unsubscribe success, channel:" + channel + ", subscribedChannels:" + subscribedChannels);
    }
}

  1. 订阅者代理,完成订阅功能
package com.xicheng.redis.pubsub;

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

/**
 * @author xichengxml
 * @date 2019/3/12 14:12
 */
public class SubProxy {

    private static Subscriber subscriber = new Subscriber();

    public static JedisPool jedisPool;

    private static final String CHANNEL = "mychannel";

    /**
     * 初始化订阅者
     */
    public static void init() {
        Jedis jedis = jedisPool.getResource();
        jedis.subscribe(subscriber, CHANNEL);
    }

}
  1. 测试功能
package com.xicheng.redis.pubsub;

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author xichengxml
 * @date 2019/3/12 14:16
 */
public class PubSubDemo {

    public static void main(String[] args) {
        // 创建连接
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);

        // 创建发布者
        Publisher publisher = new Publisher(jedisPool);
        publisher.start();

        // 创建并初始化订阅者
        SubProxy.jedisPool = jedisPool;
        SubProxy.init();
    }
}

猜你喜欢

转载自blog.csdn.net/xichengqc/article/details/88421299