Jedis를 사용한 Java Redis 게시/구독 예제

9248 단어 javaredis
이것은 Jedis를 사용하여 Java로 작성된 Redis pub/sub 예제입니다.
  • 여기에서 전체 코드를 찾을 수 있습니다: Java Redis pub/sub example .
  • Redis에서 수행할 수 있는 보다 깔끔한 기능은 다음을 참조하십시오.

  • 전제 조건


  • Download the code
  • redis-stack의 인스턴스가 실행 중입니다.
  • 아파치 메이븐 3.8.6
  • 자바 17

  • 사용 라이브러리



    예제를 단순하게 유지하기 위해 jedis만 사용합니다.

    사용된 Redis 명령



    구독하다



    이것은 하나 이상의 채널을 구독하기 위해 사용됩니다.

    subscribe channel1 channel2... channelN
    


    구독 취소



    하나 이상의 채널에 대한 현재 클라이언트 구독 취소:

    unsubscribe channel1 channel2... channelN
    


    구독하기



    채널을 구독하는 대신 다음 패턴 중 하나를 구독할 수 있습니다.

    psubscribe pattern1 pattern2... patternN
    


    예를 들어 foo*를 구독하면 foo로 시작하는 모든 채널에 대한 메시지를 받게 됩니다.

    말장난 구독



    하나 이상의 패턴 구독 취소:

    punsubscribe pattern1 pattern2... patternN
    


    출판하다



    publish는 연결된 클라이언트에 메시지를 보내고 메시지를 받은 클라이언트 수를 반환합니다.

    publish aChannel 'some message'
    




    클라이언트에서 서버로 ping을 보냅니다. 선택적으로 메시지를 보낼 수 있으며 ping이 메시지를 에코합니다.

    ping
    


    또는

    ping a message
    


    코드 연습



    클라이언트 기능을 제공하려면 확장JedisPubSub이 필요합니다.

    import redis.clients.jedis.JedisPubSub;
    
    public class LogPubSub extends JedisPubSub {
    


    이 예제를 단순하게 유지하기 위해 우리는 이름 필드를 추가하는 메시지를 받은 클라이언트를 알기 위해 매우 기본적인 기능만 추가할 것입니다.

      private String name;
    
      public LogPubSub(String name) {
        this.name = name;
      }
    

    subscribe , unsubscribe , psubscribe , punsubscribepong (성공적인 핑이 트리거하는 항목)에 대해서는 정보만 인쇄합니다.

      public void onSubscribe(String channel, int subscribedChannels) {
        System.out.printf(
            "name: %s method: %s channel: %s subscribedChannels: %d\n",
            name, "onSubscribe", channel, subscribedChannels);
      }
    
      public void onUnsubscribe(String channel, int subscribedChannels) {
        System.out.printf(
            "name: %s method: %s channel: %s subscribedChannels: %d\n",
            name, "onUnsubscribe", channel, subscribedChannels);
      }
    
      public void onPUnsubscribe(String pattern, int subscribedChannels) {
        System.out.printf(
            "name: %s method: %s patten: %s subscribedChannels: %d\n",
            name, "onPUnsubscribe", pattern, subscribedChannels);
      }
    
      public void onPSubscribe(String pattern, int subscribedChannels) {
        System.out.printf(
            "name: %s method: %s patten: %s subscribedChannels: %d\n",
            name, "onPSubscribe", pattern, subscribedChannels);
      }
    
      public void onPong(String message) {
        System.out.printf("name: %s method: %s message: %s\n", name, "onPong", message);
      }
    }
    


    메시지가 ping인 경우 정보를 인쇄하는 것 외에 클라이언트에서 메시지를 수신할 때 ping를 수행합니다. 문자열 "exit"를 수신하면 해당 채널 또는 패턴에서 구독을 취소합니다(클라이언트가 psubscribe를 사용하여 구독한 경우).

      public void onMessage(String channel, String message) {
        System.out.printf(
            "name: %s method: %s channel: %s message: %s\n", name, "onMessage", channel, message);
        switch (message) {
          case "ping":
            this.ping();
            break;
          case "exit":
            this.unsubscribe(channel);
            break;
          default:
            if (message.indexOf("ping") == 0 && message.indexOf(" ") == 4) {
              this.ping(message.substring(5));
            }
        }
      }
    
      public void onPMessage(String pattern, String channel, String message) {
        System.out.printf(
            "name: %s method: %s pattern: %s channel: %s message: %s\n",
            name, "onPMessage", pattern, channel, message);
        switch (message) {
          case "ping":
            this.ping();
            break;
          case "exit":
            this.punsubscribe(pattern);
            break;
          default:
            if (message.indexOf("ping") == 0 && message.indexOf(" ") == 4) {
              this.ping(message.substring(5));
            }
        }
      }
    


    그런 다음 JedisPooled 연결을 만들고 채널 또는 패턴을 구독하는 데 사용하기만 하면 됩니다.

    JedisPooled jedis = new JedisPooled("localhost", 6379);
    ExecutorService executor = Executors.newFixedThreadPool(4);
    
    executor.execute(() -> jedis.subscribe(new LogPubSub("onlyOne"), "dev.one"));
    executor.execute(() -> jedis.subscribe(new LogPubSub("oneAndTwo"), "dev.one", "dev.two"));
    executor.execute(() -> jedis.psubscribe(new LogPubSub("pattern"), "dev.*"));
    


    블로킹 작업이므로 스레드에서 subscribe 및 psubscribe를 실행해야 합니다.

    이 예에서 우리는 "onlyOne", "oneAndTwo"및 "pattern"으로 식별할 세 개의 클라이언트를 생성하고 있습니다. 이것은 redis에 아무 의미가 없지만 무슨 일이 일어나고 있는지 추적하는 것이 더 쉬울 것입니다.
  • "onlyOne"이 "dev.one"채널을 구독하고 있습니다.
  • "oneAndTwo"는 "dev.one"및 "dev.two"채널을 구독하고 있습니다.
  • "pattern"은 "dev.*"패턴에 가입되어 있습니다.

  • 이를 통해 RedisInsight CLI을 설치한 경우 http://localhost:8001/redis-stack/browser에서 실행되어야 하는 redis-stack에서 게시를 사용하여 메시지를 보낼 수 있습니다.

    그러나 우리는 또한 jedis를 사용하여 메시지를 보낼 것입니다.

    String message = "";
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      do {
        message = br.readLine();
        int firstSpace = message.indexOf(' ');
        if (firstSpace > 1) {
          jedis.publish(message.substring(0, firstSpace), message.substring(firstSpace + 1));
        }
      } while (!"close".equals(message));
      jedis.close();
      System.exit(0);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    


    코드 실행mvn package을 빌드하기 위해 대상에서 far jar이 생성된 다음 다음과 같이 실행할 수 있습니다java -jar RedisPubSub-1.0.jar.

    실행 예:

    ... target % java -jar RedisPubSub-1.0.jar
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    name: pattern method: onPSubscribe patten: dev.* subscribedChannels: 1
    name: oneAndTwo method: onSubscribe channel: dev.one subscribedChannels: 1
    name: oneAndTwo method: onSubscribe channel: dev.two subscribedChannels: 2
    dev.one hello
    name: pattern method: onPMessage pattern: dev.* channel: dev.one message: hello
    name: oneAndTwo method: onMessage channel: dev.one message: hello
    dev.five hello to you
    name: pattern method: onPMessage pattern: dev.* channel: dev.five message: hello to you
    dev.two also to you
    name: pattern method: onPMessage pattern: dev.* channel: dev.two message: also to you
    name: oneAndTwo method: onMessage channel: dev.two message: also to you
    dev.six exit
    name: pattern method: onPMessage pattern: dev.* channel: dev.six message: exit
    name: pattern method: onPUnsubscribe patten: dev.* subscribedChannels: 0
    dev.two exit
    name: oneAndTwo method: onMessage channel: dev.two message: exit
    name: oneAndTwo method: onUnsubscribe channel: dev.two subscribedChannels: 1
    dev.one ping say my name
    name: oneAndTwo method: onMessage channel: dev.one message: ping say my name
    name: oneAndTwo method: onPong message: say my name
    dev.two are you alive?
    dev.five no one is listening here
    dev.one this one is alive
    name: oneAndTwo method: onMessage channel: dev.one message: this one is alive
    dev.one exit
    name: oneAndTwo method: onMessage channel: dev.one message: exit
    name: oneAndTwo method: onUnsubscribe channel: dev.one subscribedChannels: 0
    dev.one not anymore
    close
    ... target %
    


    여기에서 전체 코드를 다운로드하십시오: Java Redis pub/sub example .

    좋은 웹페이지 즐겨찾기