Java实现redis的订阅发布

最近在学习关于redis相关的知识,今天记录下使用Java实现redis的发布订阅。哪里写的有问题希望各位大佬指出

话不多说直接上代码

public class main {
    public static void main(String []args){
        JedisPool jeidsPool= new JedisPool(new JedisPoolConfig(),"ip",6379); //创建连接池
        System.out.print("redis连接池已开启!");
        new Thread(new Pubisher(jeidsPool)).start();
        new Thread(new Suber(jeidsPool)).start();

    }
}
//发布者
public class Pubisher implements Runnable {
    private final JedisPool jedisPool;

    public Pubisher(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }
    @Override
    public void run() {
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        Jedis jedis=null;
        jedis=jedisPool.getResource();
        jedis.auth("xxx");//输入redis服务登陆密码
        try{
            while(true) {
                String line = "";
                line = bufferedReader.readLine();
                if (!"quit".equals(line)) {
                    jedis.publish("pubTest", line);
                } else {
                    break;
                }
            }
        }catch (Exception e){
            e.getMessage();
        }finally {
            if(null!=jedis){
                jedis.close();
            }
        }

    }
}

//订阅者需要继承jedis提供的类
public class Subsciber extends JedisPubSub {
    public Subsciber() {
    }

    @Override
    public void onMessage(String channel, String message) {             //订阅收到消息时会调用的方法
        System.out.println("收到频道:"+channel+"的消息,消息内容为:"+message);
    }

    @Override
    public void onSubscribe(String channel, int subscribedChannels) {      //订阅频道会调用的方法
        System.out.println("成功订阅频道:"+channel);
    }
}

//订阅频道

public class Suber implements Runnable {
    private final JedisPool jedisPool;
    private final Subsciber subsciber=new Subsciber();

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

    @Override
    public void run() {
        Jedis jedis=null;
        try{
            jedis=jedisPool.getResource();
            jedis.auth("xxx); //同上,没设置redis密码忽略
            jedis.subscribe(subsciber,"pubTest"); //订阅方法 (订阅者,订阅频道)
        }catch (Exception e){
            e.getMessage();
        }finally {
            if(null!=jedis) {
                jedis.close();
            }
        }

    }
}

最后运行结果:

这边简单实现了一下Java实现redis的发布与订阅,但是实现过程中遇到了一个小问题。发现redis无法被外部网络访问,会出现下面的错误

redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refus: connect

上网查了下资料发现原因在于redis.conf里面的bind 127.0.0.1 ,只需要把他改为bind 0.0.0.0就可以了。但是这样会延伸出一个问题就是Redis是在守护状态下运行的,如果不是本地连接,就会报错。不过解决方法很简单只需要设置redis连接密码就可以解决

解决方法参考:

https://blog.csdn.net/xiejiashu/article/details/77444629

https://blog.csdn.net/With__Sunshine/article/details/80636933

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值