>데이터 베이스 >Redis >Redis가 구현한 분산형 Self-increasing ID 솔루션 비교

Redis가 구현한 분산형 Self-increasing ID 솔루션 비교

PHPz
PHPz원래의
2023-06-20 08:10:382143검색

분산 애플리케이션 개발에서 자동 증가 ID 생성은 일반적인 요구 사항입니다. 독립형 환경에서는 데이터베이스의 자동 증가 기본 키를 사용하여 자동 증가 ID를 구현할 수 있지만 분산 환경에서는 자동 증가 기본 키를 사용하면 중복이 발생하므로 다른 솔루션을 사용해야 합니다. 자동 증가 ID의 고유성을 보장합니다.

Redis는 분산 Self-increasing ID 솔루션을 구현할 수 있는 고성능 인메모리 데이터베이스입니다. 이 기사에서는 세 가지 일반적인 Redis 분산형 자체 증가 ID 솔루션을 소개하고 이를 비교하여 개발자가 자신의 프로젝트에 적합한 솔루션을 선택할 수 있도록 돕습니다.

redis incr 명령을 기반으로

Redis는 지정된 키를 자동 증가시키고 자동 증가된 값을 반환할 수 있는 incr 명령을 제공합니다. incr 명령을 사용하여 자동 증가 ID를 생성하는 경우 키를 고정 문자열로 설정하고 각 작업마다 문자열을 증가시킬 수 있습니다.

Redis를 사용하여 분산 자동 증가 ID 체계를 생성하기 위한 주요 코드는 다음과 같습니다.

from redis import StrictRedis

redis = StrictRedis(host='localhost', port=6379, db=0)

def get_next_id():
    return redis.incr('id_generator')

Redis의 incr 명령은 원자적 작업이므로 여러 클라이언트가 액세스할 때 생성된 ID가 고유하다는 것을 보장할 수 있습니다. 동시에.

redis incr 명령을 기반으로 한 솔루션은 매우 간단하지만 치명적인 결함이 있습니다. Redis의 사용 가능한 최대 값(기본값은 2^31-1)에 도달하면 ID가 계속 증가합니다. 반환됩니다. 즉, 시스템이 온라인 상태가 된 후 오랜 시간 동안 서비스를 다시 시작하지 않으면 해당 ID를 사용할 수 없게 되어 데이터가 손실되거나 데이터 중단이 발생할 수 있습니다.

redis 스크립트 Lua 스크립트 기반

Redis 자체 증가 ID를 오랫동안 사용할 수 없는 문제를 방지하기 위해 Lua 스크립트를 사용하여 자체 증가 ID 범위를 제어할 수 있습니다. Lua 스크립트는 하나의 원자적 작업으로 여러 작업을 완료할 수 있으므로 자동 증가 ID를 생성할 때 항상 ID를 계속 증가시키는 대신 비즈니스 요구 사항에 따라 자동 증가 ID가 생성되어야 하는 범위를 지정할 수 있습니다. .

다음은 Lua 스크립트를 기반으로 구현된 Redis 분산 자동 증가 ID 체계의 코드입니다.

from redis import StrictRedis

redis = StrictRedis(host='localhost', port=6379, db=0)

SCRIPT = """
local name = KEYS[1]
local start = tonumber(ARGV[1])
local stop = tonumber(ARGV[2])
if redis.call('exists', name) == 0 then
    redis.call('set', name, start)
    return tonumber(start)
end
local id = redis.call('incr', name)
if id < stop then
    return tonumber(id)
else
    redis.call('set', name, start)
    return tonumber(start)
end
"""

def get_next_id(start, stop):
    result = redis.eval(script=SCRIPT, keys=['id_generator'], args=[start, stop])
    return result

이 Lua 스크립트에서는 자동 증가 ID 생성 범위를 제어하기 위해 시작과 중지라는 두 개의 매개 변수를 정의합니다. Redis에 id_generator 키가 없으면 이를 초기화하여 시작하고, 그렇지 않으면 Redis의 incr 명령을 사용하여 id_generator를 증가시키고 증가된 값이 stop 값을 초과하는지 확인합니다. 초과하는 경우 id_generator 값을 start로 재설정하고 그렇지 않으면 새로 생성된 ID를 반환합니다.

이 Lua 스크립트 기반 구현은 자동 증가 ID 생성 범위를 유연하게 제어할 수 있지만 Lua 스크립트를 실행하고 매개변수를 전달하려면 Redis eval 명령을 사용해야 합니다.

redis 기반 Redlock

Redlock은 Redis에서 제공하는 분산 잠금 솔루션으로, 분산 환경에서 동시에 하나의 클라이언트만 동일한 리소스에 액세스할 수 있도록 보장합니다. 생성된 자동 증가 ID가 고유한지 확인하기 위해 Redlock을 사용하여 분산 자동 증가 ID 체계를 구현할 수 있습니다.

Redlock을 사용하여 분산 자체 증가 ID 체계를 구현하는 주요 코드는 다음과 같습니다.

from redis import StrictRedis
from redlock import Redlock

redis = StrictRedis(host='localhost', port=6379, db=0)
redlock = Redlock([{"host": "localhost", "port": 6379, "db": 0}], retry_times=3)

def get_next_id():
    with redlock.lock('id_lock', 1000):
        return redis.incr('id_generator')

Redlock을 사용하여 분산 자체 증가 ID 체계를 구현하면 여러 클라이언트가 액세스할 때 중복 ID 생성 문제를 피할 수 있습니다. 동시에 스레드 안전 문제를 방지하기 위해 자동 증가 ID를 생성할 때 잠글 수 있습니다.

그러나 잠금 작업은 많은 시간과 리소스를 소비하므로 동시성이 높은 시나리오에서는 Redlock의 성능이 저하될 수 있습니다.

비교 분석

분산 자체 증가 ID 솔루션의 세 가지 Redis 구현에는 각각 고유한 장점과 단점이 있습니다. 비교를 분석해 보겠습니다.

  1. redis incr 명령 기반

장점: 구현이 간단하고 편리하며 빠릅니다. .

단점: ID가 저절로 계속 늘어나게 되어 ID 불가, 데이터 유실, 데이터 끊김 등의 문제가 발생할 수 있습니다.

적용 가능한 시나리오: 데이터 ID의 높은 연속성을 요구하지 않는 간단한 비즈니스 시나리오.

  1. redis 스크립트 기반 Lua 스크립트

장점: 자체 증가 ID의 생성 범위를 유연하게 제어하여 데이터의 연속성을 보장할 수 있습니다.

단점: 구현이 복잡하며 Redis eval 명령을 사용하여 Lua 스크립트를 실행하고 매개변수를 전달해야 합니다.

적용 가능한 시나리오: 전자상거래, 금융 등 데이터 ID 연속성 및 비즈니스 로직에 대한 엄격한 요구 사항이 있는 시나리오

  1. redis Redlock 기반

장점: 잠금 작업은 스레드 안전성을 보장하고 반복적인 데이터 생성 문제를 방지합니다.

단점: 잠금 작업은 많은 시간과 리소스를 소비하므로 동시성이 높은 시나리오에서는 성능이 저하될 수 있습니다.

적용 가능한 시나리오: 동시성, 배포가 높고 데이터 ID의 연속성에 대한 요구 사항이 높은 시나리오입니다.

결론

위의 비교 분석을 바탕으로 다음과 같은 결론을 내릴 수 있습니다.

  1. redis incr 명령을 기반으로 한 두 솔루션과 redis Redlock 기반 솔루션은 적용 범위가 좁고 모든 시나리오에 적합하지 않습니다. .
  2. redis 스크립트를 기반으로 하는 Lua 스크립트 솔루션은 자동 증가 ID의 생성 범위를 유연하게 제어할 수 있으며 데이터 ID 연속성과 높은 비즈니스 로직 요구 사항이 필요한 시나리오에 적합합니다.

따라서 분산형 Self-Increasing ID 솔루션을 구현하기 위해 Redis를 선택할 때는 비즈니스 시나리오의 구체적인 요구 사항을 고려하고 적절한 솔루션을 선택해야 합니다.

위 내용은 Redis가 구현한 분산형 Self-increasing ID 솔루션 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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