자바 구현 redis 게시 구독(간단 하고 알 기 쉬 움)

redis 의 응용 장면 이 너무 많아 서 지금 그것 의 몇 가지 특성 중 하 나 를 소개 합 니 다.   구독 발표(pub/sub).
특성 소개:
redis 의 게시 구독(pub/sub)은 무엇 입 니까?   Pub/Sub 기능(means Publish,Subscribe)은 게시 및 구독 기능 입 니 다.이 벤트 를 바탕 으로 하 는 시스템 에서 Pub/Sub 는 현재 광범 위 하 게 사용 되 는 통신 모델 로 이 벤트 를 기본 적 인 통신 메커니즘 으로 하고 대규모 시스템 이 요구 하 는 느슨 한 결합의 상호작용 모델 을 제공한다.구독 자(예 를 들 어 클 라 이언 트)는 이벤트 구독 방식 으로 이 벤트 를 받 아들 이 는 데 관심 이 있 는 이벤트 나 이 벤트 를 나타 낸다.게시 자(예 를 들 어 서버)는 구독 자가 관심 이 있 는 이 벤트 를 수시로 관련 구독 자 에 게 알 릴 수 있다.디자인 모델 을 잘 아 는 친 구 는 23 가지 디자인 모델 중의 관찰자 모델 과 매우 비슷 하 다 는 것 을 알 아야 한다.
마찬가지 로 Redis 의 pub/sub 는 메시지 통신 모델 로 메시지 게시 자 와 메시지 구독 자 간 의 결합 을 해제 하 는 것 이 주요 목적 입 니 다.  Redis 는 pub/sub 의 server 로 구독 자 와 게시 자 사이 에서 메시지 경로 의 기능 을 합 니 다.
상술 한 전문 적 인 해석 을 못 알 아 들 었 다 면 괜 찮 습 니 다.사실 저도 잘 못 알 아 들 었 습 니 다.
쉽게 말 하면 이 안에 채널 의 개념 도 있다.여기 가 바로 채널 의 뜻 이다.예 를 들 어 은행 의 채널 을 구독 했다.자금 이 변동 이 생 겼 을 때 은행 이 채널 을 통 해 메 시 지 를 보 내 는 것 을 받 아들 일 것 이다.여기 서 당신 은 은행 에 정 보 를 요구 하 는 것 이 아니 라 수 동적 으로 받 는 것 이다.이 예 에서 당신 은 sub(구독 자)이다.은행 은 pub 입 니 다.
프로젝트 운용 필드:
항상 당신 이 같은 기술 을 할 수 있다 고 생각 하기 전에 이런 기술 이 어느 곳 에서 사용 되 는 지 먼저 알 아야 합 니 다.맹목적 으로 배 워 서 는 안 됩 니 다.
게시 구독 의 특성 을 보고 간단 한 실시 간 채 팅 시스템 을 만 드 는 것 이 가장 적합 하 다.이것 은 그 중의 하나 이다.물론 이런 물건 은 우리 개발 에서 거의 언급 되 지 않 는 다.자주 사용 하 는 것 을 들 어 우리 의 분포 식 구조 에서 읽 기와 쓰기 가 분 리 된 장면 을 자주 만 날 수 있 습 니 다.기록 하 는 과정 에서 redis 를 사용 하여 구독 을 발표 하여 기록 값 을 각 읽 는 프로그램 에 신속하게 발표 하면 데이터 의 완전 일치 성 을 확보 할 수 있 습 니 다.예 를 들 어 한 블 로그 사이트 에서 100 명의 팬 이 당신 을 구독 하고 새로운 글 을 올 리 면 팬 들 에 게 메 시 지 를 전달 할 수 있 습 니 다.아무튼 장면 이 많아 발굴 이 필요 해.
자바 가 redis 를 어떻게 조작 하 는 지 되 돌아 보기:
redis 는 캐 시 데이터베이스 이 고 C/S 의 구조 이기 도 합 니 다.즉,클 라 이언 트 와 서버 입 니 다.일반적으로 자바 에서 저 희 는 jdis(클 라 이언 트)를 사용 하여 redis(서버)를 조작 합 니 다.그 중에서 조작 할 때 이들 은 반드시 연결 을 해 야 합 니 다.데이터 베이스 링크 처럼 관계 형 데이터 베이스 에서 저 희 는 보통 연결 풀 을 유지 합 니 다.연결 을 만 들 고 닫 는 시간 을 줄 이기 위해 링크 를 재 활용 합 니 다.그래서 jedis 에서 도 하나의 jedispol(jedis 연결 풀)개념 이 존재 합 니 다.우 리 는 모두 연못 에서 연결 을 찾 아 사용 합 니 다.
상위 코드:
제 디 스 를 사용 하려 면 먼저 의존 도 를 도입 하 세 요.

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
게시 자 만 들 기(게시 자)

public class Publisher extends Thread{

  private final JedisPool jedisPool;

  public Publisher(JedisPool jedisPool) {
    this.jedisPool = jedisPool;
  }
  
  @Override
  public void run() {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    Jedis jedis = jedisPool.getResource();  //          
    while (true) {
      String line = null;
      try {
        line = reader.readLine();
        if (!"quit".equals(line)) {
          jedis.publish("mychannel", line);  //  mychannel         
        } else {
          break;
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}
구독 자 하나 더 만 들 기

public class Subscriber extends JedisPubSub {
  public Subscriber(){}
  @Override
  public void onMessage(String channel, String message) {    //       
    System.out.println(String.format("receive redis published message, channel %s, message %s", channel, message));
  }
  @Override
  public void onSubscribe(String channel, int subscribedChannels) {  //        
    System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d",
        channel, subscribedChannels));
  }
  @Override
  public void onUnsubscribe(String channel, int subscribedChannels) {  //        
    System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d",
        channel, subscribedChannels));

  }
}
여기 구독 자 는 JedisPub Sub 를 계승 하여 세 가지 방법 을 다시 써 야 합 니 다.용도 주석 에 이미 써 있어 서 매우 간단 하 다.
저 희 는 구독 자 를 정 의 했 을 뿐 입 니 다.다음은 채널 을 구독 하 러 갑 니 다.

public class SubThread extends Thread {
  private final JedisPool jedisPool;
  private final Subscriber subscriber = new Subscriber();

  private final String channel = "mychannel";

  public SubThread(JedisPool jedisPool) {
    super("SubThread");
    this.jedisPool = jedisPool;
  }

  @Override
  public void run() {
    System.out.println(String.format("subscribe redis, channel %s, thread will be blocked", channel));
    Jedis jedis = null;
    try {
      jedis = jedisPool.getResource();  //      
      jedis.subscribe(subscriber, channel);  //  subscribe  api   ,          
    } catch (Exception e) {
      System.out.println(String.format("subsrcibe channel error, %s", e));
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
  }
}
마지막 으로 테스트 클래스 를 하나 더 써 서 뛰 어 보 세 요.키보드 가 메 시 지 를 입력 하면 구독 자 는 onMessage 방법 을 터치 합 니 다.

public class PubSubDemo {
  public static void main( String[] args )
  {
    //   redis   
    JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
    
    System.out.println(String.format("redis pool is starting, redis ip %s, redis port %d", "127.0.0.1", 6379));

    SubThread subThread = new SubThread(jedisPool); //   
    subThread.start();

    Publisher publisher = new Publisher(jedisPool);  //   
    publisher.start();
  }
}
인쇄 결과 보기

코드 주소 첨부  https://github.com/fangyong1421/redis
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기