복붙노트

[REDIS] 어떻게 레디 스에 분산 잠금을 만드는 방법?

REDIS

어떻게 레디 스에 분산 잠금을 만드는 방법?

레디 스 문서에, 나는 원시적 잠금 SETNX를 통해 구현 될 수 발견 :

http://redis.io/commands/setnx

일부 사용자가 만료가 클라이언트의 및 서버의 시간을 필요로 UNIX 타임 스탬프를 사용하여 주석 그러나 완벽하게 동기화 할 수 있습니다. 레디 스의 글로벌 / 분산 잠금을 만들 더 나은 대안이 있습니까?

해결법

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

    1.대신 SETNX의 사용 SET. SET 초 및 밀리 초 단위로 만료 시간 대신 UNIX 타임 스탬프 값에 대한 인수를 받아들입니다.

    대신 SETNX의 사용 SET. SET 초 및 밀리 초 단위로 만료 시간 대신 UNIX 타임 스탬프 값에 대한 인수를 받아들입니다.

    오래된 SETNX 기반 패턴은 역사적인 이유에 대해 설명되어 있습니다.

    SETNX 설명에서 :

  2. ==============================

    2.> = 2.6 LUA 스크립트 솔루션 레디 스를 사용하는 것은 좋은 것입니다. 루아 스크립트는 항상 원자 그래서 실행 :

    > = 2.6 LUA 스크립트 솔루션 레디 스를 사용하는 것은 좋은 것입니다. 루아 스크립트는 항상 원자 그래서 실행 :

    --lockscript, parameters: lock_key, lock_timeout
    local lock = redis.call('get', KEYS[1])
    if not lock then    
        return redis.call('setex', KEYS[1], ARGV[1], "locked");
    end
    return false
    

    SET 명령의 새로운 옵션을 기반으로 다른 솔루션

    SET lock_key "locked" EX lock_timeout NX 
    

    사용 레디 스 <2.6 멀티 갖는 패턴을 사용할 수있다 :

    MULTI
    SETNX tmp_unique_lock some_value
    EXPIRE tmp_unique_lock
    RENAMENX tmp_unique_lock real_lock
    EXEC
    
  3. ==============================

    3.링크를 따라 좋은 프로젝트 설명 잠금 http://redis.io/topics/distlock https://github.com/mrniko/redisson

    링크를 따라 좋은 프로젝트 설명 잠금 http://redis.io/topics/distlock https://github.com/mrniko/redisson

  4. ==============================

    4.SET의 새로운 인수는 잠금을 설정하기위한 충분하지만, 레디 스에서 이러한에만 작업> = v2.6.12 당신은 또한 잠금 등의 설정이 해제 및 만료 방법에 대해 생각해야합니다

    SET의 새로운 인수는 잠금을 설정하기위한 충분하지만, 레디 스에서 이러한에만 작업> = v2.6.12 당신은 또한 잠금 등의 설정이 해제 및 만료 방법에 대해 생각해야합니다

    나는 레디 스를 사용하여 분산 된 잠금에 대한 우리의 엔지니어링 블로그에 게시물을 작성했습니다. 그것은 설정하고 검증 및 교착 상태 방지와 안정적으로 잠금을 해제하는 방법에 대한 스크립팅을 다룹니다. 나는 또한 당신이 똑바로 상자의 잠금에 사용할 수있는 Node.js를 작성 모듈을 포함한다.

  5. ==============================

    5.나는 misterion는 멋진 보석에 언급하는 SET EX NX 솔루션을 gem'ed - simple_redis_lock을

    나는 misterion는 멋진 보석에 언급하는 SET EX NX 솔루션을 gem'ed - simple_redis_lock을

    코드는 간단하고 다음과 같습니다 :

    def lock(key, timeout)
      if @redis.set(key, Time.now, nx: true, px: timeout)
        begin
          yield
        ensure
          release key
        end
      end
    end
    
  6. from https://stackoverflow.com/questions/20736102/how-to-create-a-distributed-lock-with-redis by cc-by-sa and MIT license