Java 클라이언트를 통해 위 기능을 구현하는 데에는 특정 결함이 있습니다. 동시성이 높은 경우 데이터가 일관되지 않을 수 있습니다. 작업의 원자성을 보장하기 위해 전체 로직을 캡슐화하는 lua 스크립트를 사용하는 것이 좋습니다. SCRIPT LOAD를 사용하면 스크립트가 서버에 캐시되고 sha1 검사 값 + 매개변수(Key, ARG)를 통해 실행되어 네트워크 전송을 줄일 수 있습니다.
예를 들어보세요. 1. 기능적 요구사항: 키가 존재하지 않으면 키를 설정하고 false를 반환하고, 타임아웃에 도달하거나 지정된 개수에 도달하면 카운트를 1로 설정합니다. false를 반환하고 다시 시작합니다. 시간 초과를 설정하고 시간 초과에 도달하지 않고 지정된 개수에 도달하지 않은 경우 true를 반환하고 개수를 증가시킵니다
이런 종류의 계수사업은 먼저 계수를 한 후 사업을 해야 합니다. 사업이 완료되고 카운터가 한도 값보다 커지면 어리둥절해집니다.
내 계획은 다음과 같습니다.
동시성으로 인한 데이터 불일치로 인해 Redis의
INCR
명령을 사용하여 1씩 증가시키고 최신 값을 얻는 것을 고려해 볼 수 있습니다(이것은 일회성 작업이므로 불일치 발생):3보다 크면 초과되어 종료되었음을 의미합니다.
이 3보다 작거나 같으면 비즈니스를 다시 실행합니다(비즈니스 실행 실패에 대한 롤백 카운터도 고려할 수 있음).
Java 클라이언트를 통해 위 기능을 구현하는 데에는 특정 결함이 있습니다. 동시성이 높은 경우 데이터가 일관되지 않을 수 있습니다. 작업의 원자성을 보장하기 위해 전체 로직을 캡슐화하는 lua 스크립트를 사용하는 것이 좋습니다. SCRIPT LOAD를 사용하면 스크립트가 서버에 캐시되고 sha1 검사 값 + 매개변수(Key, ARG)를 통해 실행되어 네트워크 전송을 줄일 수 있습니다.
예를 들어보세요.
1. 기능적 요구사항: 키가 존재하지 않으면 키를 설정하고 false를 반환하고, 타임아웃에 도달하거나 지정된 개수에 도달하면 카운트를 1로 설정합니다. false를 반환하고 다시 시작합니다. 시간 초과를 설정하고 시간 초과에 도달하지 않고 지정된 개수에 도달하지 않은 경우 true를 반환하고 개수를 증가시킵니다
redis.lua 스크립트는 다음과 같습니다.
으아아아자바 코드는 다음과 같습니다.
으아아아