[REDIS] 주장 만료와 레디 스 큐
REDIS주장 만료와 레디 스 큐
내가 레디 스에서 구현하려는 인터페이스 나는 큐가 있습니다. 트릭은 노동자가 추락하고 항목을 다시 청구 할 수 있어야 추정있어 그 후 각 근로자가 N 초에 대한 항목을 주장 할 수 있다는 것입니다. 이 완료되면 항목을 제거하는 작업자의 책임입니다. 당신은 어떻게 레디 스에서 이런 짓을 했을까? 나는 phpredis를 사용하고 있지만 그 무관의 종류입니다.
해결법
-
==============================
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.당신은 [SETNX]와 레디 스에서 표준 동기화 잠금 방식 [1]을 설정할 수 있습니다. 기본적으로, 당신은 모두가 취득을 시도하는 잠금을 만들 SETNX를 사용합니다. 잠금을 해제하려면 DEL 그것을 당신은 또한이 잠금 해제를 만들기 위해 EXPIRE 설정할 수 있습니다. 이 다른 고려 사항은 여기 없지만, 분산 응용 프로그램에서 잠금 및 임계 영역을 설정하는 일반 중 아무것도.
당신은 [SETNX]와 레디 스에서 표준 동기화 잠금 방식 [1]을 설정할 수 있습니다. 기본적으로, 당신은 모두가 취득을 시도하는 잠금을 만들 SETNX를 사용합니다. 잠금을 해제하려면 DEL 그것을 당신은 또한이 잠금 해제를 만들기 위해 EXPIRE 설정할 수 있습니다. 이 다른 고려 사항은 여기 없지만, 분산 응용 프로그램에서 잠금 및 임계 영역을 설정하는 일반 중 아무것도.
from https://stackoverflow.com/questions/7625101/redis-queue-with-claim-expire by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 노드 레디 스를 사용하여 해시 키의 모든 필드와 값을 가져옵니다 (0) | 2020.01.24 |
---|---|
[REDIS] 레디 스 봄 데이터 레디 스 SSL을 사용하는 경우 "Jedis 연결을 가져올 수 없습니다" (0) | 2020.01.24 |
[REDIS] 토네이도 셀러리는 gen.Task 또는 콜백을 사용할 수 없습니다 (0) | 2020.01.24 |
[REDIS] 레디 스의 다른 명령의 결과를 전달 (0) | 2020.01.24 |
[REDIS] 예 socket.io - 레디 스를 사용하는 (0) | 2020.01.24 |