복붙노트

[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. ==============================

    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. ==============================

    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
    
  3. 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