最近在学习关于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