>백엔드 개발 >PHP 튜토리얼 >Redis는 메시지 대기열을 어떻게 구현합니까?

Redis는 메시지 대기열을 어떻게 구현합니까?

小云云
小云云원래의
2018-02-27 13:26:469588검색

즉시 서버 요청 처리를 비동기 처리로 변경하여 서버에 대한 부담을 완화하고 순차적인 데이터 수집을 달성합니다. 이 기사에서는 모든 사람에게 도움이 되기를 바라며 Redis가 메시지 대기열을 구현하는 방법을 주로 공유합니다.

Redis는 메시지 대기열을 어떻게 구현합니까?

메시지 큐는 메시지 전송 프로세스 중에 메시지를 임시로 저장하는 컨테이너로, 다양한 플랫폼과 언어의 애플리케이션 간에 데이터를 전송할 수 있으며 대규모 동시성을 처리할 수 있습니다. 문제를 다룰 때 매우 효과적일 수 있습니다.

지금 메시지 대기열을 사용하는 시나리오에 대해 이야기해 보겠습니다. 내 시스템은 클라이언트로부터 실시간으로 요청(주기적 요청)을 받고 요청된 데이터를 데이터베이스에 저장해야 합니다. 매번 요청되는 데이터의 양은 적지만. 빈번한 데이터베이스 운영 요구로 인해 시스템에 성능 병목 현상이 발생했습니다. 원래 아이디어는 이 데이터를 Redis에 직접 저장하는 것이었지만 잘 생각해보면 매번 데이터의 양은 크지 않지만 Redis에도 지속성 기능이 있지만 데이터는 순환적이고 계속해서 증가하기 때문에, 지속성에 의존한다면 하드 디스크에 저장하면 인메모리 데이터베이스로서의 Redis의 장점을 잃게 되므로 결국 메시지 큐를 사용하기로 결정했습니다.

방법은 다음과 같습니다.

매번 요청된 데이터는 메시지 대기열에 직접 기록된 후 클라이언트에 응답이 전달됩니다. 데이터가 기록되면 백그라운드에서 스레드가 열려 메시지 대기열을 모니터링합니다. , 메시지 큐의 데이터를 가져와 mysql 데이터베이스에 기록하므로 데이터베이스를 직접 운영함으로써 발생하는 시스템 병목 현상을 방지하면서 비동기식으로 데이터베이스에 실시간 데이터를 쓸 수 있습니다.

그렇다면 어떤 메시지 대기열을 사용해야 할까요? 현재 RabbitMQ, ActiveMQ 등과 같은 더 많은 주류 메시지 대기열이 있습니다. 그들의 기술은 상대적으로 성숙하고 매우 효율적입니다. 그러나 프로젝트 자체가 redis(캐싱용)를 사용했고 매번 데이터의 양이 상대적으로 적다는 점을 고려하면 redis는 키-값 데이터베이스일 뿐만 아니라 HashMap, Set, List 등 풍부한 데이터 유형을 지원합니다. 그 중 The List는 메시지 큐로 사용할 수 있고 Redis List는 blpop, brpop 등의 차단 명령을 지원하므로 내 요구 사항을 완벽하게 충족할 수 있습니다. 간단한 테스트 코드는 다음과 같습니다.

//产生数据
import redis.clients.jedis.Jedis;
public class RedisProducer {
    /** 
     * jedis操作List 
     */  
    public static void main(String[] args){
        Jedis jedis = new Jedis("192.168.10.209", 6379); 
        for(int i = 0;i<10;i++) {
            jedis.lpush("informList","value_" + i);  
        }
        jedis.close();
    }
}
//消费数据
import java.util.List;
import redis.clients.jedis.Jedis;
public class RedisConsumer {
    /** 
     * jedis操作List 
     */  
    public static void main(String[] args){
       ScheduleMQ mq = new ScheduleMQ();
       mq.start();
    }   
}
class ScheduleMQ extends Thread {
    @Override
    public void run() {
        while(true) {
            Jedis jedis = new Jedis("192.168.10.209", 6379);
            //阻塞式brpop,List中无数据时阻塞
            //参数0表示一直阻塞下去,直到List出现数据
            List<String> list = jedis.brpop(0, "informList");
            for(String s : list) {
                System.out.println(s);
            }
            jedis.close();
        }
    }
}

관련 권장 사항:

PHP Redis 메시지 대기열을 사용하여 Weibo를 게시하는 방법

php는 메시지 대기열 클래스 인스턴스 공유를 구현합니다.

PHP 고급 프로그래밍 메시지 대기열

위 내용은 Redis는 메시지 대기열을 어떻게 구현합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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