자바 구현 redis 게시 구독(간단 하고 알 기 쉬 움)
특성 소개:
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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.