푸시 문제를 해결하기 위해 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 - PUBSUBc1에 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!