java实现redis的发布订阅(使用spring-data-redis.jar包)

一、导入jar包

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

二、发布者

注:在java中加入代码,mychannel为订阅标识,isOk为发送内容

注:升级:使用spring-data-redis.jar包工具redisTemplate方法发送

JedisPool jedisPool = new JedisPool();
Jedis resource = jedisPool.getResource();
resource.publish("mychannel", "isOk");

三、订阅者(接收者)

package cn.sky999.util.redis;
import static cn.sky999.util.webSocket.WebSocketTest.webSocketMap;
import java.io.IOException;
import redis.clients.jedis.JedisPubSub;

/**
 * @author Timor
 *
 */
public class Subscriber extends JedisPubSub  {

	public Subscriber(){
		
	}
	@Override
	public void onMessage(String channel, String message) {
		// TODO Auto-generated method stub
		super.onMessage(channel, message);
                //接收到的消息内容channel=mychannel,   message=isOk
		System.out.println(channel+"      "+message);
	}
	@Override
	public void onSubscribe(String channel, int subscribedChannels) {
		// TODO Auto-generated method stub
		super.onSubscribe(channel, subscribedChannels);
		System.out.println(2);
	}
	@Override
	public void onUnsubscribe(String channel, int subscribedChannels) {
		// TODO Auto-generated method stub
		super.onUnsubscribe(channel, subscribedChannels);
		System.out.println(3);
	}
}

四、将订阅者加入线程

注:channel 设置成上面设置的订阅标识mychannel

package cn.sky999.util.redis;

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

/**
 * @author Timor
 *
 */
public class SubThread extends Thread {

    private final JedisPool jedisPool;
    private final Subscriber subscriber = new Subscriber();

    private final String channel = "mychannel";

    public SubThread(JedisPool jedisPool) {
        super("SubThread");
        this.jedisPool = jedisPool;
    }

    @Override
    public void run() {
        System.out.println(String.format("subscribe redis, channel %s, thread will be blocked", channel));
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();   //取出一个连接
            jedis.subscribe(subscriber, channel);    //通过subscribe 的api去订阅,入参是订阅者和频道名
        } catch (Exception e) {
            System.out.println(String.format("subsrcibe channel error, %s", e));
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
    }
}

五、启动线程

注:正式项目放到监听器中

public static void main(String[] args) {
    	// 连接redis服务端
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
        
        System.out.println(String.format("redis pool is starting, redis ip %s, redis port %d", "127.0.0.1", 6379));

        SubThread subThread = new SubThread(jedisPool);  //订阅者
        subThread.start();
	}

六、特别注意

 

                            没啦,启动线程就没了

 

 

 

 

参考资料 :https://www.cnblogs.com/xinde123/p/8489054.html

                   https://www.cnblogs.com/kinglf/p/5972300.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值