>  기사  >  데이터 베이스  >  Redis에는 몇 가지 유형의 잠금이 있습니까?

Redis에는 몇 가지 유형의 잠금이 있습니까?

anonymity
anonymity원래의
2019-06-05 10:00:243103검색

Redis 잠금 분류

redis에서 사용할 수 있는 잠금 명령은 INCR, SETNX, SET

Redis에는 몇 가지 유형의 잠금이 있습니까?

첫 번째 잠금 명령 INCR

이 잠금의 개념은 키가 잠금에 포함되지 않는다는 것입니다. 존재하는 경우 키의 값은 먼저 0으로 초기화된 다음 이를 1씩 증가시키기 위해 INCR 연산이 수행됩니다.

그런 다음 다른 사용자가 하나를 추가하기 위해 INCR 작업을 수행할 때 반환된 숫자가 1보다 크면 잠금이 사용 중이라는 의미입니다.

    1、 客户端A请求服务器获取key的值为1表示获取了锁
    2、 客户端B也去请求服务器获取key的值为2表示获取锁失败
    3、 客户端A执行代码完成,删除锁
    4、 客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功
    5、 客户端B执行代码完成,删除锁
    $redis->incr($key);
    $redis->expire($key, $ttl); //设置生成时间为1秒

두 번째 잠금 SETNX

이 잠금의 아이디어는 키가 존재하지 않으면 키를 값으로 설정한다는 것입니다.

키가 이미 존재하면 SETNX는 아무런 조치도 취하지 않습니다

    1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
    2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
    3、 客户端A执行代码完成,删除锁
    4、 客户端B在等待一段时间后在去请求设置key的值,设置成功
    5、 客户端B执行代码完成,删除锁
    $redis->setNX($key, $value);
    $redis->expire($key, $ttl);

세 번째 시드 잠금 SET

위의 두 가지 방법에는 키 만료 시간을 설정해야 한다는 문제가 있습니다. 그렇다면 키 만료를 설정해야 하는 이유는 무엇입니까? 어떤 이유로 요청 실행이 예기치 않게 종료되어 잠금이 생성되었지만 삭제되지 않은 경우 잠금은 항상 존재하므로 나중에 캐시가 업데이트되지 않습니다. 따라서 예상치 못한 이벤트를 방지하려면 잠금에 만료 시간을 추가해야 합니다.

하지만 Expire로 설정하는 것은 원자적 연산이 아닙니다. 따라서 트랜잭션을 통해서도 원자성(Atomicity)을 보장할 수 있으나 여전히 일부 문제가 있어 관계자는 2.6.12 버전부터 SET 명령 자체를 사용하면 만료 시간을 설정하는 기능이 포함됐다고 밝혔다.

아아아아

위 내용은 Redis에는 몇 가지 유형의 잠금이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.