Redis - 发布和订阅

本文介绍Redis中的发布与订阅功能,包括基本概念、命令使用及Java编程实现方式。通过具体示例,展示了如何设置订阅者与发布者,并演示了消息传递过程。

一、概述


1). 发布和订阅是一种消息通信模式。

2). 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式。

 

二、发布和订阅


订阅命令: 

// 订阅一个或多个频道
// 返回值:value_1 为 “subcribe” 表示订阅成功,value_2 为订阅的频道名称,value_3 表示当前订阅的频道个数
subscribe  channel1  channel2  channel3 ...
// 模式订阅
// 返回值:value_1 为 “psubcribe” 表示订阅成功,value_2 为订模式订阅的 pattern,value_3 表示当前订阅的频道个数
psubscribe abc*  xyz*  ...

发布命令:

// 发布命令
publish channel msg

启动订阅者 X 和订阅者 Y,分别发出订阅命令,如下面两张图片:

 

 

启动发布者,发布如下消息:

 

订阅者 X 和订阅者 Y 都收到了订阅消息:

 

取消订阅(取消订阅在官方给的客户端上是无法模拟的)

UNSUBSCRIBE  cctv-1
PUNSUBSCRIBE  cctv-*

 

查看订阅

// 查看订阅的所有频道
pubsub  channels;
pubsub  channels  msg*;
// 查看该频道的订阅人数
pubsub  numsub  channel1 channel2 ... ;

   

 

三、编程展示 Redis 的发布和订阅


编程展示:

public class MySub extends JedisPubSub{

    @Override
    public void onMessage(String channel, String msg) {
        System.out.println("onMessage - " + channel +" - " +msg);
    }

    @Override
    public void onPMessage(String pattern, String channel, String msg) {
        System.out.println("onPMessage - " + pattern +" - "+ channel +" - " +msg);
    }

    @Override
    public void onPSubscribe(String channel, int msg) {
        System.out.println("onPsubscribe - " + channel +" - "+ msg);
    }

    @Override
    public void onPUnsubscribe(String arg0, int arg1) {}

    @Override
    public void onSubscribe(String channel, int number) {
        System.out.println("onSubscribe - " + channel +" - "+ number);
        
    }

    @Override
    public void onUnsubscribe(String arg0, int arg1) {}
}

 

订阅者 A

public class SubClient {
    public static void main(String[] args) {
        MySub sub = new MySub();
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.subscribe(sub, "cctv-1");
    }
}

 

订阅者 B (模式订阅) 

public class PsubClient {
    public static void main(String[] args) {
        MySub sub = new MySub();
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.psubscribe(sub, "cctv*");
    }
}

 

发布者 C

public class PubClient {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.publish("cctv-1", "hello,this is cctv-1");
    }
}

 

依次运行客户端 ABC

A 端输出

onSubscribe - cctv-1 - 1
onMessage - cctv-1 - hello,this is cctv-1

B 端输出

onPsubscribe - cctv* - 1
onPMessage - cctv* - cctv-1 - hello,this is cctv-1

 

转载于:https://www.cnblogs.com/xmsx/p/5360171.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值