Redis具有publish/subscribe(发布/订阅)功能。当订阅了一个频道(channel)之后,有人在该频道上发布消息,你都可以收到。
package redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public final class RedisUtils {
private static JedisPool jedisPool = null;
private static String host = "127.0.0.1";
private static Integer port = 6379;
private static Integer timeout = 5 * 1000;
private static String password = null;
private RedisUtils(){
}
static synchronized Jedis getJedis(){
if(jedisPool==null){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//指定连接池中最大空闲连接数
jedisPoolConfig.setMaxIdle(10);
//链接池中创建的最大连接数
jedisPoolConfig.setMaxTotal(100);
//创建连接前先测试连接是否可用
jedisPoolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(jedisPoolConfig,host,port,timeout,password);
}
return jedisPool.getResource();
}
}
1、发布
package redis;
import redis.clients.jedis.Jedis;
public class JedisPublisher {
public static void main(String[] args) {
Jedis jedis = RedisUtils.getJedis();
//返回订阅者数量
Long countSubscribe = jedis.publish("channel1", "message");
System.out.println("发布成功,订阅数量:"+ countSubscribe);
}
}
2、订阅(JedisPubSub)
解决订阅频道,由于重启redis导致订阅异常中断的问题。jedis的subscribe()方法是线程阻塞的,连接正常时,就一直处于订阅状态,等待频道发布消息。当redis重启时,捕获到异常。然后等待和循环,直到重新连接,然后订阅频道。
创建订阅者时,可以new JedisPubSub(){};也可以类继承。创建时可以重写onMessage和onSubscribe方法。onMessage就是订阅的频道有消息发布时执行,onSubscribe方法就是订阅频道时执行。
package redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class JedisSubscribe {
public static void main(String[] args) {
JedisPubSub jedisPubSub = new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println("onMessage"+"---"+channel + ":" + message);
}
@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println("onSubscribe"+"---"+channel + ":" + subscribedChannels);
}
};
Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(() -> {
try(Jedis jedis = RedisUtils.getJedis()){
System.out.println("jedis资源获取成功");
// 订阅频道消息
jedis.subscribe(jedisPubSub,"channel1");
} catch (Exception e) {
System.out.println("异常,等待重试");
}
},0L,5L, TimeUnit.SECONDS);
}
//继承
class Subscribe extends JedisPubSub{
@Override
public void onMessage(String channel, String message) {
System.out.println("onMessage"+"---"+channel + ":" + message);
}
@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println("onSubscribe"+"---"+channel + ":" + subscribedChannels);
}
}
}