>  기사  >  백엔드 개발  >  Redis를 사용하여 PHP에서 분산 예약 작업 구현

Redis를 사용하여 PHP에서 분산 예약 작업 구현

王林
王林원래의
2023-05-15 14:01:361103검색

Redis는 빠른 읽기 및 쓰기 속도, 일정 수준의 지속성 및 풍부한 데이터 유형을 지원하는 장점을 갖춘 고성능 인 메모리 데이터베이스입니다. Redis는 캐싱, 메시지 큐, 실시간 순위와 같은 시나리오에서 자주 사용됩니다. 개발 중에 이메일 보내기, 임시 파일 정리, 캐시 업데이트 등과 같은 분산 예약 작업을 구현해야 하는 경우가 있습니다. 이 문서에서는 Redis를 사용하여 분산 예약 작업을 구현하는 방법을 소개합니다.

1. Redis에서 지원하는 데이터 유형

Redis에서 지원하는 데이터 유형에는 문자열, 해시, 목록, 집합 및 순서 집합이 있습니다. 분산 예약 작업을 구현할 때 주로 순서가 지정된 세트와 목록이라는 두 가지 데이터 유형에 중점을 둡니다.

  1. Ordered Set

Ordered Set은 Redis에서 제공하는 데이터 유형으로 해시 테이블과 유사하며 키-값 쌍을 저장할 수 있지만 값(점수라고도 함)이 반복될 수 있으며 각 값은 ​​는 점수와 연관되어 있으며, 점수는 정렬에 사용됩니다. 순서가 지정된 세트의 요소는 점수에 따라 작은 것부터 큰 것 순으로 정렬됩니다.

분산된 예약 작업을 구현하기 위해 정렬된 세트를 사용할 때 작업의 실행 시간을 점수로, 작업 내용을 값으로 사용하고 각 작업을 정렬된 세트에 저장할 수 있습니다.

  1. List

List는 Redis에서 제공하는 데이터 유형으로 배열과 유사하며 목록의 앞부분이나 뒷부분에 요소를 추가하고 삭제할 수 있습니다. Redis는 lpush, rpush, lpop, rpop 등과 같은 풍부한 명령 목록을 제공합니다.

목록을 사용하여 분산 예약 작업을 구현할 때 작업 내용을 목록에 저장하고 lpop 명령을 사용하여 실행할 작업을 얻을 수 있습니다.

2. 분산 타이밍 작업 구현 단계

분산 타이밍 작업 구현은 대략 다음 단계로 나눌 수 있습니다.

  1. 순서가 지정된 세트에 작업을 추가하고 작업의 실행 시간을 점수로 설정합니다.
  2. 백그라운드 프로세스를 시작하여 정렬된 컬렉션의 작업을 검색하고, 작업을 실행해야 하는지 여부를 결정하고, 실행해야 하는 작업을 작업 목록에 추가합니다.
  3. 여러 작업자 프로세스를 시작하고 작업 목록에서 작업을 팝업하여 실행하세요.
  4. 실행 후 주문한 세트에서 작업을 삭제하세요.
  5. 순서 세트에 작업 추가

순서 세트에 작업을 추가하려면 다음 명령을 사용하세요.

ZADD 작업 타임스탬프 콘텐츠

여기서 작업은 순서 세트의 이름이고 타임스탬프는 순서 세트의 실행 시간입니다. task(Unix 타임스탬프), content는 작업의 내용입니다.

예를 들어 "메일 보내기" 작업을 주문한 컬렉션에 추가하려면 실행 시간이 10분 후 다음 명령을 사용할 수 있습니다.

ZADD 작업 $(date -d "+10 분" +%s ) "이메일 보내기"

  1. 정렬된 세트의 작업 검색

백그라운드 프로세스를 시작하고 다음 명령을 사용하여 정렬된 세트에서 실행해야 하는 모든 작업을 가져옵니다.

ZRANGEBYSCORE 작업 -inf $(date +%s) WITHSCORES

그 중 -inf는 정렬된 세트의 최소값을 나타내고, $(date +%s)는 현재 시간의 Unix 타임스탬프를 나타냅니다.

위 명령은 점수가 포함된 목록을 반환합니다. 예:

1) "임시 파일 지우기"
2) "1626387489"

여기서 "임시 파일 지우기"는 작업 내용이고 "1626387489"는 실행입니다. 작업 시간의.

수행해야 할 모든 작업을 가져온 후 해당 작업을 작업 목록에 추가하세요.

  1. 작업 실행

여러 작업자 프로세스를 시작하고 작업 목록에서 작업을 팝업하여 실행하세요. 실행 후 작업은 주문된 세트에서 제거됩니다.

목록에서 작업을 팝업하고 실행하려면 다음 명령을 사용하세요.

lpop jobs

여기서 작업은 목록의 이름입니다.

  1. 주문 세트에서 작업 삭제

작업이 실행된 후 다음 명령을 사용하여 주문 세트에서 작업을 삭제합니다.

ZREM 작업 콘텐츠

여기서 작업은 주문 세트의 이름입니다. 내용은 작업의 내용입니다.

3. 코드 구현

아래에서는 PHP를 사용하여 위 단계를 구현합니다.

  1. 정렬된 집합에 작업 추가

정렬된 집합에 작업을 추가하려면 다음 코드를 사용하세요.

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 添加任务到有序集合
$timestamp = strtotime("+10 minutes");
$redis->zAdd('tasks', $timestamp, 'send email');
  1. 정렬된 집합의 작업을 스캔하세요

다음 코드를 사용하여 정렬된 집합 작업을 스캔하고 작업 목록에 실행해야 하는 작업:

while(true) {
    // 扫描有序集合中的任务
    $scoreTasks = $redis->zRangeByScore('tasks', '-inf', time(), array('withscores' => true));
    foreach($scoreTasks as $task => $score) {
        // 将需要执行的任务添加到任务列表中
        $redis->lpush('task_list', $task);
        // 将任务从有序集合中删除
        $redis->zRem('tasks', $task);
    }
    // 每隔5秒扫描一次
    sleep(5);
}
  1. 작업 실행

다음 코드를 사용하여 여러 작업자 프로세스를 시작하고 실행할 작업 목록에서 작업을 팝업합니다.

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

for($i=0; $i<10; $i++) {
    // 启动10个Worker进程
    $pid = pcntl_fork();
    if($pid == -1) {
        echo 'fork error!' . PHP_EOL;
        exit;
    } else if($pid == 0) {
        // 子进程中获取任务列表中的任务并执行
        while(true) {
            // 从列表中弹出一条任务
            $task = $redis->rpop('task_list');
            if(empty($task)) {
                continue;
            }
            // 执行任务
            mail('user@example.com', 'Task', $task);
        }
    }
}

IV. Redis를 사용하여 분산 예약 작업을 구현하는 단계 및 코드 구현입니다. Redis를 사용하면 분산 작업 예약을 쉽게 구현하고 동시 처리 기능과 작업 실행 효율성을 향상시킬 수 있습니다. 실제 애플리케이션에서는 잠금을 사용하여 작업 목록에 대한 상호 배타적 액세스를 수행하거나 타이머를 사용하여 정기적으로 작업을 얻는 등 실제 상황에 따라 코드를 최적화해야 합니다.

위 내용은 Redis를 사용하여 PHP에서 분산 예약 작업 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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