>  기사  >  Java  >  Redis 게시 및 구독이란 무엇입니까?

Redis 게시 및 구독이란 무엇입니까?

PHP中文网
PHP中文网원래의
2017-06-20 09:56:161588검색

푸시 문제를 해결하기 위해 Redis의 구독-퍼블리싱 모델을 사용해볼까 생각했습니다~.

개념적인 설명을 위해 다소 언급해야 할 부분이 있습니다.

什么是Redis发布订阅?Redis发布订阅是一种消息通信模式,发送者通过通道A发送消息message,订阅过通道A的客户端就可以接收到消息message。嗯度娘上面的解释要比我所说的好多了,而我所理解的就是:所谓的订阅发布模式,其实和我们看电视,听广播差不多,在我们没有调台(换频道)的时候,那个频道也是在传递消息的(发布)。我们换到那个频道上(订阅)就能接收到消息了。是的,虽然可能有些不恰当~

Instructions

本文中示例采用了三个客户端,以“品”字形排列,由上至下,由左至右分别为客户端1(c1),客户端2(c2),客户端3(c3).特此说明。

Redis 구독 및 게시 명령

먼저 Redis 서버 구축과 관련하여 말씀드리고 싶은 점은 관련 내용을 확인하시기 바랍니다.

Redis에는 게시 및 구독을 위한 간단한 명령이 6개 밖에 없다고 들었습니다. 즉:

  • PSUBSCRIBE 패턴 [패턴...]

  • 패턴 형식과 일치하는 하나 이상의 채널을 구독하세요

  • PUBLISH 채널 메시지

  • chanel에 메시지 게시

  • PUBSUB 하위 명령 [인수 [인수 ...]]

  • 구독 및 게시 시스템 상태 보기

  • PUNSUBSCRIBE [패턴 [패턴 ...]]

  • 형식을 충족하는 모든 채널에서 구독 취소

  • SUBSCRIBE 채널 [채널...]

  • 하나 이상의 채널을 구독하세요

  • UNSUBSCRIBE [채널 [채널...]]

  • 채널 구독 취소


예 1 - SUBSCRIBE

redis에 연결 그런 다음

SUBSCRIBE study

명령을 입력하여 Study라는 채널을 구독하세요.

다음에 스터디 채널에서 메시지를 보내드리겠습니다. ~~


예 2 - PUBLISH

다른 클라이언트를 엽니다. 글리프 레이아웃의 맨 위에 있는 클라이언트를 게시자로 사용하고 있으며 이때 클라이언트 1이 스터디 채널에 메시지를 게시하는 것을 볼 수 있습니다. , 클라이언트 2(연구 채널 구독)는 c1이 게시한 메시지를 받을 수 있지만 클라이언트 3은 연구 채널을 구독하지 않았기 때문에 c1이 보낸 메시지를 받을 수 없습니다.

예 3 - PSUBSCRIBE

이제 블로거의 왼손과 오른손을 슬로우 모션으로 따라가보세요. c3에

PUBLISH study "message1-go go go"

OK를 입력하고 이제 c1에

PSUBSCRIBE study*

를 입력합니다. 위 결과 그림은

c3이 와일드카드 형식을 채택하고 있으며 학습 채널도 성공적으로 구독되었습니다.

다음으로, 계속해서 c1에 명령을 입력하세요:

PUBLISH study "message2"

psubscribe를 사용하면 스터디 채널을 구독할 뿐만 아니라 스터디가 이끄는 채널도 구독하는 것을 볼 수 있습니다.

예 4 - PUBSUB

c1에 pubsub 채널을 입력하면 다음을 얻을 수 있습니다.

PUBLISH study:java "I hate java forever"

는 현재 활성 채널을 의미합니다.

Jedis는 구독 게시자 모델을 구현합니다
127.0.0.1:6379> PUBSUB channels

1) "study"

그런 다음 먼저 명령줄에서 메시지를 게시합니다.

그 후 jedis를 사용하여 프로젝트에 메시지를 게시합니다.

우리는 정상적으로 통신할 수 있습니다 ~ 오 예 ~

핵심 코드:

PublishMessage.java는 메시지 게시를 위한 스레드를 시작하는 데 사용됩니다.

好了,上面通过命令行熟悉了一下Redis中有关订阅发布者模式的相关命令。下面我们要将redis的订阅与发布者嵌入到项目中。

首先,我们使用jedis先订阅一个名为:study的频道

ChatSubscribe.java는 JedisPubSub

private Logger logger = LoggerFactory.getLogger(PublishMessage.class);

@Resource
private JedisCluster jedisCluster;

/**
 * 发布消息
 *
 * @param channel 频道
 * @param message 信息
 */
public void sendMessage(final String channel, final String message) {
    Thread thread = new Thread(() -> {
        Long publish = jedisCluster.publish(channel, message);
        logger.info("服务器在: {} 频道发布消息{} - {}", channel, message, publish);
    });
    logger.info("发布线程启动:");
    thread.setName("publishThread");
    thread.start();
}

SubScribeMessage.java에서 상속된 구독 관련 이벤트를 처리하는 데 사용됩니다. 채널 구독, 채널 취소 및 기타 액션 수업

private Logger logger = LoggerFactory.getLogger(ChatSubscribe.class);

// 取得订阅的消息后的处理
@Override
public void onMessage(String channel, String message) {
    logger.info("订阅成功,接收到的消息为:频道-{},消息-{}", channel, message);
    RedisString.message = message;
}

// 取得按表达式的方式订阅的消息后的处理
@Override
public void onPMessage(String pattern, String channel, String message) {
    System.out.println("-----取得按表达式的方式订阅的消息后的处理-----");
    System.out.println(pattern + "=" + channel + "=" + message);
}

// 初始化按表达式的方式订阅时候的处理
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
    System.out.println("-----初始化按表达式的方式订阅时候的处理-----");
    System.out.println(pattern + "=" + subscribedChannels);
}

// 取消按表达式的方式订阅时候的处理
@Override
public void onPUnsubscribe(String pattern, int subscribedChannels) {
    System.out.println("-----取消按表达式的方式订阅时候的处理-----");
    System.out.println(pattern + "=" + subscribedChannels);
}

@Override
public void onPong(String pattern) {
    super.onPong(pattern);
}

// 初始化订阅时候的处理
@Override
public void onSubscribe(String channel, int subscribedChannels) {
    logger.info("初始化订阅信息:频道-{},订阅频道-{}", channel, subscribedChannels);
}

// 取消订阅时候的处理
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
    logger.info("已取消订阅频道{}", channel);
}

위 내용은 Redis 게시 및 구독이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.