복붙노트

[REDIS] 주장 만료와 레디 스 큐

REDIS

주장 만료와 레디 스 큐

내가 레디 스에서 구현하려는 인터페이스 나는 큐가 있습니다. 트릭은 노동자가 추락하고 항목을 다시 청구 할 수 있어야 추정있어 그 후 각 근로자가 N 초에 대한 항목을 주장 할 수 있다는 것입니다. 이 완료되면 항목을 제거하는 작업자의 책임입니다. 당신은 어떻게 레디 스에서 이런 짓을 했을까? 나는 phpredis를 사용하고 있지만 그 무관의 종류입니다.

해결법

  1. ==============================

    1.나는 이런 식으로 뭔가를하려고 줄을 다시 추락 작업에 사용할 수있는 레디 스에서 간단한 큐를 실현하기 :

    나는 이런 식으로 뭔가를하려고 줄을 다시 추락 작업에 사용할 수있는 레디 스에서 간단한 큐를 실현하기 :

    근로자는 같은 것을 할 것입니다 작업을 잡으려고 노력 :

    timeout = 3600
    #wrap this in a transaction so our cleanup wont kill the task
    #Move the job away from the queue so nobody else tries to claim it
    job = RPOPLPUSH(up_for_grabs, being_worked_on)
    #Set a lock and expire it, the value tells us when that job will time out. This can be arbitrary though
    SETEX('lock:' + job, Time.now + timeout, timeout)
    #our application logic
    do_work(job)
    
    #Remove the finished item from the queue.
    LREM being_worked_on -1 job
    #Delete the item's lock. If it crashes here, the expire will take care of it
    DEL('lock:' + job)
    

    그리고 모든 이제 다음, 우리는 단지 우리의 목록을 잡고 거기에있는 모든 작업이 실제로 잠금을 가지고 있음을 확인할 수 있습니다. 우리는 잠금 장치가없는 모든 일자리를 찾을 경우,이 수단이 만료 된 우리 근로자 아마 추락했다. 이 경우 우리는 다시 제출합니다.

    이는 대한 의사 코드가 될 것이다 :

    loop do
        items = LRANGE(being_worked_on, 0, -1)
        items.each do |job| 
            if !(EXISTS("lock:" + job))
                puts "We found a job that didn't have a lock, resubmitting"
                LREM being_worked_on -1 job
                LPUSH(up_for_grabs, job)
            end
        end
        sleep 60
    end
    
  2. ==============================

    2.당신은 [SETNX]와 레디 스에서 표준 동기화 잠금 방식 [1]을 설정할 수 있습니다. 기본적으로, 당신은 모두가 취득을 시도하는 잠금을 만들 SETNX를 사용합니다. 잠금을 해제하려면 DEL 그것을 당신은 또한이 잠금 해제를 만들기 위해 EXPIRE 설정할 수 있습니다. 이 다른 고려 사항은 여기 없지만, 분산 응용 프로그램에서 잠금 및 임계 영역을 설정하는 일반 중 아무것도.

    당신은 [SETNX]와 레디 스에서 표준 동기화 잠금 방식 [1]을 설정할 수 있습니다. 기본적으로, 당신은 모두가 취득을 시도하는 잠금을 만들 SETNX를 사용합니다. 잠금을 해제하려면 DEL 그것을 당신은 또한이 잠금 해제를 만들기 위해 EXPIRE 설정할 수 있습니다. 이 다른 고려 사항은 여기 없지만, 분산 응용 프로그램에서 잠금 및 임계 영역을 설정하는 일반 중 아무것도.

  3. from https://stackoverflow.com/questions/7625101/redis-queue-with-claim-expire by cc-by-sa and MIT license