[REDIS] 다른 키에 카운터가 0 미만이면 원자 세트에서 항목을 제거?
REDIS다른 키에 카운터가 0 미만이면 원자 세트에서 항목을 제거?
2.0.3 레디 스
내 레디 스 DB에서 나는 항목의 집합을 가지고있다. 각 항목은 그와 관련된 카운터를 가지고 :
MULTI
SADD "items-set" "foo"
INCRBY "items:foo" 10000
EXEC
새로운 항목은 임의의 간격으로 세트에 추가됩니다.
사용자가 특정 작업을 수행 할 때, 카운터는 감소된다 :
new_counter = DECR "items:foo"
나는 카운터가 0 이하로 떨어질 때 원자, 집합에서 항목을 제거해야합니다 (또는 :. 카운터에 도달 정확히 제로 때, 나는 그것을 위해 논리를 해결할 수 있습니다)
if new_counter < 0 then
MULTI
SREM "items-set" "foo"
DEL "items:foo"
EXEC
end
어떻게 SETNX / GETSET와 항목 이름을 잠그지 않고이 작업을 수행 할 수 있습니까?
레디 스의 방법 I 저장소 데이터의 변화를 포함하는 솔루션은 허용됩니다. (그러나, 단지의 경우, 내가 초기 텍스트에서 놓칠 수있는 몇 가지 작업 별 세부로 대응 할 수있는 권리를 보유합니다.)
해결법
-
==============================
1.단지 레디 스 2.2의 새로운 시계 기능을 사용 :
단지 레디 스 2.2의 새로운 시계 기능을 사용 :
WATCH items-set items:foo count = GET items:foo IF count == 0: MULTI SREM items-set foo SET items:foo count-1 EXEC ELSE: MULTI SET items:foo count-1 EXEC
당신이 시계의 작동 방식을 이해하는 데 필요한 예제를 이해합니다. http://redis.io 사이트에서 문서를 확인하시기 바랍니다.
추신. 레디 스 2.0.3이 작업을 수행 할 방법이 없습니다
-
==============================
2.다른 사람이 중간에 값을 만지면 다시 시도 할 수 있습니다 그것은, 루프에 있어야합니다.
다른 사람이 중간에 값을 만지면 다시 시도 할 수 있습니다 그것은, 루프에 있어야합니다.
success = false while not success WATCH items-set items:foo count = GET items:foo MULTI IF count == 0: SREM items-set foo SET items:foo count-1 success = EXEC
from https://stackoverflow.com/questions/5118807/atomically-remove-an-item-from-set-if-a-counter-in-another-key-is-below-zero by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 모방 MASTER / MASTER를 레디 스? 또는 다른 것? (0) | 2020.01.19 |
---|---|
[REDIS] 레디 스 연결 오류는 푸른 VM에 Booksleeve 레디 스 클라이언트를 사용하는 경우 (0) | 2020.01.19 |
[REDIS] 쿠키와 레디 스 세션 저장소의 차이점은 무엇입니까? (0) | 2020.01.19 |
[REDIS] 레디 스 종료 (0) | 2020.01.19 |
[REDIS] jedis와 연결 레디 스 클러스터 (0) | 2020.01.19 |