redis 发布订阅方式

SUBSCRIBE channel [channel ...]  订阅一个或多个频道
 PUBLISH channel message  将信息发送至指定频道

 PSUBSCRIBE pattern [pattern ...]  订阅一个或多个符合模式的频道

PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态

 PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道

UNSUBSCRIBE [channel [channel ...]]  退订一个或多个频道

一 命令行

1 开启两个redis客户端   

在客户端1订阅cctv频道

127.0.0.1:6379> SUBSCRIBE  cctv
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv"
3) (integer) 1

在客户端2发送一条消息

127.0.0.1:6379> PUBLISH  cctv nihao 

查看客户端1

127.0.0.1:6379> SUBSCRIBE  cctv
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv"
3) (integer) 1
1) "message"
2) "cctv"
3) "nihao"

redis 发布订阅方式

2 退订

127.0.0.1:6379> UNSUBSCRIBE cctv
1) "unsubscribe"
2) "cctv"
3) (integer) 0

3 查看活跃中的订阅频道

127.0.0.1:6379> PUBSUB CHANNELS
1) "cctv"
127.0.0.1:6379> 

4 退订全部

127.0.0.1:6379> PUNSUBSCRIBE  *
1) "punsubscribe"
2) "*"
3) (integer) 0
127.0.0.1:6379> 

5 订阅多个

127.0.0.1:6379> PSUBSCRIBE *
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*"
3) (integer) 1

二  java 方式模拟

1 模拟订阅客户端继承JedisPubSub抽象类 实现其中的消息接收 订阅 取消订阅触发事件的方法

package redisUtils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

public class RedisSubTest1 extends JedisPubSub{
	public RedisSubTest1(){};
	@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);
	}
	@Override
	public void onUnsubscribe(String channel, int subscribedChannels) { // 取消订阅的时候触发
		System.out.println("我取消订阅了");
	}

public static void main(String[] args) {
	Jedis jedis = RedisUtils.getJedis();
	RedisSubTest1 client = new RedisSubTest1(); 
	jedis.subscribe(client, "cctv");

}
}

2 模拟发布客户端  延时发送消息

package redisUtils;

import java.util.List;

import redis.clients.jedis.Jedis;

public class RedisPushClient {
public static void main(String[] args) {
	Jedis jedis  = RedisUtils.getJedis();
	for (int i = 0; i < 5; i++) {
		jedis.publish("cctv", "学习redis?" + System.currentTimeMillis());
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
		
			e.printStackTrace();
		}
	
	}
	List<String> pubsubChannels = jedis.pubsubChannels("*");
	System.out.println(pubsubChannels);
}
}

redis 发布订阅方式

redis 发布订阅方式

完成简单的发布订阅模拟