- 概念
- 正如其名,类比微博,当我们关注(订阅)某个大V(频道兼发布者),当他更新动态的时候,我们就能看到他发布的东西
- 角色
- 发布者(publisher)
- 订阅者(subscriber)
- 频道(channel)
常用命令
Pub/Sub
subscribe 订阅
SUBSCRIBE channel [channel ...] 订阅给定的一个或多个频道的消息
publish 发布
PUBLISH channel message 将信息message发送到指定的频道channel
Psubscribe 匹配模式
PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道
unsubscribe 取消订阅
unsubscribe [channel] #一个或多个 取消一个或多个频道,由于redis-cli退出订阅会直接退出redis-cli,所以无法演示
- pubsub
- pubsub channels 列出至少有一个订阅者的频道
- pubsub numsub [channel …] 列出给定频道的订阅者数量
Jedis实现发布订阅
参考地址:
https://www.cnblogs.com/xinde123/p/8489054.html
创建一个Publisher(发布者)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import com.redis.demo.RedisPool; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class Publisher extends Thread { private final JedisPool jedisPool; public Publisher(JedisPool jedisPool) { this.jedisPool = jedisPool; } @Override public void run() { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Jedis jedis = jedisPool.getResource(); //连接池中取出一个连接 jedis.auth("anntly"); while (true) { String line = null; try { line = reader.readLine(); if(!"quit".equals(line)) { jedis.publish("mychannel",line); //从 mychannel的频道上推送消息 } else { break; } } catch(IOExceptione) { e.printStackTrace(); } } } }
创建一个订阅者
import redis.clients.jedis.JedisPubSub; public class Subscriber extends JedisPubSub { public Subscriber(){} @Override public void onMessage(String channel, String message) { //收到消息会调用 System.out.println(String.format("receive redis published message, channel%s, message %s",channel,message)); } @Override public void onSubscribe(String channel, int subscribedChannels) { //订阅了频道会调用 System.out.println(String.format("subscribe redis channel success, channel%s,subscribedChannels %d", channel,subscribedChannels)); } @Override public void onUnsubscribe(String channel, int subscribedChannels) { //取消订阅会调用 System.out.println(String.format("unsubscribe redis channel, channel %s,subscribedChannels %d", channel,subscribedChannels)); } }
创建一个订阅频道
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; 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.auth("anntly"); jedis.subscribe(subscriber,channel); //通过subsc ribe的api去订阅 ,入参是订阅者和频道名 } catch(Exception e) { System.out.println(String.format("subsrcibe channel error, %s", e)); } finally { if (jedis !=null) { jedis.close(); } } } }
测试类
import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class PublishDemo{ public static void main( String[] args) { // 连接redis服务端 JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "192.168.25.129", 6379); System.out.println(String.format("redis pool is starting, redis ip %s, redis port %d", "192.168.25.129", 6379)); SubThread subThread = new SubThread(jedisPool); //订阅者 subThread.start(); Publisher publisher = new Publisher(jedisPool); //发布者 publisher.start(); } }
- 在控制窗口输入要发布的消息”abc”,结果如下