Redis实现的发布和订阅
api
重要的方法说明
A、publish发布消息
语法:publish chanel message
作用:将message消息发送到channel频道。message是要发送的消息,channel是自定
义的频道名称(例如cctv1,cctv5),唯一标识发布者。
返回值:数字。接收到消息订阅者的数量
B、subscribe订阅频道
语法:subscribe channel[channel…]
作用:订阅一个或多个频道的信息
返回值:订阅的消息
C、unsubscribe退订频道
语法:unsubscribe channel [channel]
作用:退出指定的频道,不订阅。
返回值:退订的告知消息
一、Linux实现原理
1.1、开启3个redis客户端(2个做消息的订阅者,1个做消息的发布者)
这里用第一个做消息的发布者
1.2、让后两个订阅者订阅一个频道(“cctv5”)
执行subscribe cctv5 的命令‘’
1.3、用发布者(redis客户端)发送消息,验证订阅者是否能接受到消息
publish 消息
查看订阅端
经过验证就能说明(发布和订阅)成功
1.4、一方退出客户端(或者退订)
上图表明一个客户端已经退出(ctrl+c)
再次在发布者端发送一个消息(观察接收端)
通过上图,证明一方退出以后,将接受不到消息,而未退出的依旧能接受消息
二、java代码实现原理(Jedis)
2.1、导入Jedis依赖(maven官网找)
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
2.1、创建一个订阅者类(RedisSubScribe)
package com.redis.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @ClassName
* @Description 订阅者
* @Author ZQS
* @Date 2020/8/15 0015 14:31
* @Version 1.0
**/
public class RedisSubScribe extends JedisPubSub {
/***
*当收到消息回调
* @param channel
* @param message
*/
@Override
public void onMessage(String channel, String message) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("我是订阅者:订阅频道[" + channel + "],收到的消息是:[" + message + "],时间为:[" + df.format(new Date()) + "]");
}
public static void main(String[] args) {
//创建jedis对象
Jedis jedis=new Jedis("49.234.127.186",6379);
RedisSubScribe redisSubScribe=new RedisSubScribe();
jedis.subscribe(redisSubScribe,"cctv6");
}
}
- 继承JedisPubSub 类(最大的订阅者父类)
- 重写onMessage()方法
- 运行方法中创建Jedis对象,与远端Redis连接(地址、端口)
- 创建订阅者对象
- 从Redis订阅jedis.subscribe(redisSubScribe,“cctv6”);
- 运行(等待状态)
第一种
2.2、在redis客户端向频道(cctv6)发送消息
发送之前注意(高版本需要设置)
在redis.config文件中设置(屏蔽只能本地读取+#)
设置能在别的客户端连接这个Redis服务器(将yes改为no)
2.3、查看控制台(订阅者端)是否接受消息
第二种
创建发布者类
package com.redis.test;
import redis.clients.jedis.Jedis;
/**
* @ClassName
* @Description 发布者
* @Author ZQS
* @Date 2020/8/15 0015 15:41
* @Version 1.0
**/
public class MyRedisPublish {
public static void main(String[] args) {
// 创建Jedis
Jedis jedis = new Jedis("49.234.127.186", 6379);
jedis.publish("cctv6", "玫瑰");
System.out.println("发布消息完毕....");
}
}
这样就完成了一个简单的订阅和发布功能