Java jedis实现 Redis的Pub/Sub模式

本文详细介绍了如何在Redis中使用Pub/Sub功能进行消息传递,包括基本的订阅与发布操作,以及如何利用Java的Jedis库实现监听器和发布者的代码示例。通过具体的运行实例,展示了如何在实际应用中实现消息的实时传输。
摘要由CSDN通过智能技术生成
在redis-cli中使用Pub/Sub
订阅

在这里插入图片描述

发送

在这里插入图片描述
接收
在这里插入图片描述

通配符的Pub/Sub

Redis还支持通配符的订阅和发布。客户端可以订阅满足一个或多个规则的channel消息,相应的命令是PSUBSCRIBE和PUNSUBSCRIBE。接下来我们再用另一个redis-cli客户端来订阅"chi*"的channel
在这里插入图片描述
在这里插入图片描述

Java中使用
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>3.1.0</version>
		</dependency>

  • 监听器

package com.ghgcn.redis.test01;

import redis.clients.jedis.JedisPubSub;

/**
 * jredis 监听
 *
 * @author 刘楠
 * @date 2019年9月23日 下午2:35:46   
 * @version 1.0
 */
public class JedisPus extends JedisPubSub {

        @Override
        public void onMessage(String channel, String message) {
            System.out.println("onMessage  Channel:" + channel + ",Message:" + message);
        }
     
        @Override
        public void onPMessage(String pattern, String channel, String message) {
            System.out.println("onPMessage  Pattern:" + pattern + ",Channel:" + channel + ",Message:" + message);
        }
     
        @Override
        public void onSubscribe(String channel, int subscribedChannels) {
            System.out.println(" onSubscribe---channel:"+channel+",subscribedChannels:"+subscribedChannels);
        }
     
        @Override
        public void onPUnsubscribe(String pattern, int subscribedChannels) {
            System.out.println(" onPUnsubscribe---pattern:"+pattern+",subscribedChannels:"+subscribedChannels);
        }
     
        @Override
        public void onPSubscribe(String pattern, int subscribedChannels) {
            System.out.println("onPSubscribe---pattern:"+pattern+",subscribedChannels:"+subscribedChannels);
        }
    }

发布者
package com.ghgcn.redis.test01;

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

import redis.clients.jedis.Jedis;

public class Publisher {

    private Jedis jedis;
    private String channel;

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

    public void startPublish() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                System.out.println("请输入message:");
                String line = reader.readLine();
                if (!"quit".equals(line)) {
                    jedis.publish(channel, line);
                } else {
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行


package com.ghgcn.redis.test01;

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

public class PubMain {
    //Channel
    public static final String CHANNEL = "mytestchannel";
    //redis连接地址
    public static final String HOST = "192.168.99.100";
    //端口
    public static final int PORT = 32768;
    //配置
    private static JedisPoolConfig poolConfig = new JedisPoolConfig();
    //连接池
   private static JedisPool jedisPool  = new JedisPool(poolConfig, HOST, PORT);
    
    public static void main(String[] args) {
      
        //发送者
        final Jedis publisherJedis = jedisPool.getResource();
        //订阅者
        final Jedis subscriberJedis = jedisPool.getResource();

        //监听器
        JedisPus jedisPus = new JedisPus();
        //启动线程
        new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("开始订阅。。。。。。。。");
                    subscriberJedis.subscribe(jedisPus, CHANNEL);
                    System.out.println("订阅结束。。。。。。。。。");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        //开始发送消息
        new Publisher(publisherJedis, CHANNEL).startPublish();
        //关闭连接
        publisherJedis.close();
        //取消订阅
        jedisPus.unsubscribe();
        //订阅者关闭
        subscriberJedis.close();
    }

}

  • 结束

开始订阅。。。。。。。。
请输入message:
 onSubscribe---channel:mytestchannel,subscribedChannels:1
33
请输入message:
onMessage  Channel:mytestchannel,Message:33
44
请输入message:
onMessage  Channel:mytestchannel,Message:44
55
请输入message:
onMessage  Channel:mytestchannel,Message:55
66
请输入message:
onMessage  Channel:mytestchannel,Message:66
77
请输入message:
onMessage  Channel:mytestchannel,Message:77
88
请输入message:
onMessage  Channel:mytestchannel,Message:88
99
请输入message:
onMessage  Channel:mytestchannel,Message:99

下面是一个简单的Spring Boot Redis Pub/Sub示例代码: 首先需要在pom.xml中添加redis和spring-boot-starter-data-redis依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.6.0</version> </dependency> ``` 然后编写一个Redis消息监听器: ```java @Component public class RedisMessageListener { @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired private MessageListenerAdapter messageListenerAdapter; @PostConstruct public void init() { new Thread(() -> { Jedis jedis = new Jedis("localhost"); jedis.subscribe(messageListenerAdapter, "test-channel"); }).start(); } @Bean public MessageListenerAdapter messageListenerAdapter() { return new MessageListenerAdapter(new RedisMessageSubscriber()); } public class RedisMessageSubscriber { public void handleMessage(String message) { System.out.println("Received message: " + message); } } } ``` 然后可以在其他地方发布消息到Redis中: ```java @RestController public class RedisController { @Autowired private StringRedisTemplate stringRedisTemplate; @GetMapping("/publish") public String publish() { stringRedisTemplate.convertAndSend("test-channel", "Hello, Redis!"); return "Message sent"; } } ``` 这样,当调用/publish接口时,就会向Redis的test-channel频道发布一条消息,RedisMessageListener中的RedisMessageSubscriber就会收到该消息并进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值