Redis 대기열에 정기적으로 다중 프로세스 중복없이 값 추가
아래의 방법으로 잘 될 것 같다.
다음은 초당 타임 스탬프를 대기열에 추가하는 예입니다.
# cron.rb
require "redis"
require "json"
QUEUE_NAME = "per_sec" # キューの名前
TIMESTAMP_NAME = "per_sec_timestamp" # 最後にキューに値を追加したときのタイムスタンプ
redis = Redis.new
loop do
t = Time.now.to_i
redis.watch(TIMESTAMP_NAME) # TIMESTAMP_NAME の値が exec までに変わっていれば multi - exec 間のコマンドを失敗させる
last = redis.get(TIMESTAMP_NAME).to_i
if last < t
redis.multi
redis.rpush(QUEUE_NAME, t)
redis.set(TIMESTAMP_NAME, t)
redis.exec ? puts("set #{t}") : puts("transaction fail")
end
sleep 0.1
end
위의 스크립트를 2 프로세스 시작하고
while true; do redis-cli lpop per_sec; sleep 0.1s; done
에서 큐의 내용을 pop 계속 하면 다음과 같이 되어 중복 없이 큐에 추가할 수 있는 것을 알 수 있다.Redis가 클러스터 모드에 대응
클러스터 모드의 경우 MULTI - EXEC 간의 조작은 키가 같은 해시 슬롯에 있는 경우에 한정된다 ( 참고 ).
이것에 대응하기 위해서는 타임 스탬프를 보존하는 키의 해시에 사용하는 캐릭터 라인을 큐의 키명으로 하면 된다.
TIMESTAMP_KEY = "{#{QUEUE_KEY}}:updated_at".freeze
CLUSTER KEYSLOT per_sec
와 CLUSTER KEYSLOT {per_sec}:updated_at
가 일치한다 = 같은 해시 슬롯에 저장되므로 MULTI - EXEC 를 사용할 수 있다.
Reference
이 문제에 관하여(Redis 대기열에 정기적으로 다중 프로세스 중복없이 값 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/labocho/items/204325df59126a1eb7b1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
TIMESTAMP_KEY = "{#{QUEUE_KEY}}:updated_at".freeze
Reference
이 문제에 관하여(Redis 대기열에 정기적으로 다중 프로세스 중복없이 값 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/labocho/items/204325df59126a1eb7b1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)