주문 번호 높 음 및 발생 (2)

4401 단어
은 련 16 비트 디지털 주문 번호 가 영원히 중복 되 지 않 는 생 성 알고리즘
1. 전제 배경
은 련 결 제 를 한 사람 은 모두 알 고 있 습 니 다. 은 련 의 주문 번 호 는 업 체 에 중복 되 지 않 는 16 개의 디지털 주문 번 호 를 제공 하 라 고 요구 합 니 다.16 자리 수 는 사실 매우 짧 기 때문에 1 초 에 1w 또는 10w 또는 100 만 원 이 동시에 발생 하 는 것 을 고려 해 야 할 때 중복 주문 번 호 는 셀 수 없 을 것 이다.고려 해 야 할 요소: 데이터 베 이 스 를 사용 하여 흐름 번 호 를 저장 하면 클 러 스 터 배 치 를 할 때 동기 화 키 워드 는 더 이상 유효 하지 않 습 니 다.물론 동기 화 는 성능 에 도 큰 영향 을 미친다.* 61656. 시간 을 사용 하려 면 밀리초, 미묘 한 단계 까지 정확하게 해 야 한다. 길 이 는 16 비트 가 아니다.* 61656. 데이터베이스 필드 를 사용 하면 데이터 베 이 스 를 병행 할 때 하드웨어 가 견 딜 수 없습니다.『 61656 』 주문 번호 가 져 올 때 검사 표 의 최대 치 를 얻 는 방안 이 가장 바람 직 하지 않 습 니 다.다음은 본인 이 깊이 연구 한 세 가지 방안 을 제시 하고 순서대로 가장 좋 은 방안 은 세 번 째 입 니 다.비고: 중복 주문 번호 가 발생 하 는 상황 을 테스트 하려 면 표를 만 들 고 주문 번호 필드 를 유일 성 으로 설정 한 다음 1000 또는 10000 이상 의 스 레 드 를 열 어 요청 하 는 방법 을 사용 할 수 있 습 니 다. 스 레 드 마다 5 회 또는 10 회 순환 하여 요청 하고 방법 에 삽입 문 구 를 쓸 수 있 습 니 다.혹은 Apache 의 ab 도 구 를 사용 하여 테스트 를 병행 할 수 있 습 니 다.사용 방법: ab - n5000 - c 5000http://192.168.1.102:8888/kjcx/aaa.action
2. 선택 가능 한 방안 1
이 방안 은 현재 시간 을 사용 합 니 다. 밀리초 수, 나 초 수 를 포함 하고 데이터 베 이 스 를 계산 에 참여 할 필요 가 없습니다. 성능 은 말 할 필요 가 없습니다.알고리즘:
OrderId=
machineId+
(System.currentTimeMillis()+"").substring(1)+
(System.nanoTime()+"").substring(7,10);

설명: 매개 변수 machineId: 클 러 스 터 의 기계 코드 로 1 - 9 임 의 할 수 있 습 니 다.배치 할 때 각각 배 치 된 프로젝트 로 수 동 으로 이 값 을 수정 하여 클 러 스 터 의 여러 대의 기계 가 시스템 시간 에 일치 하지 않 는 문 제 를 확보 합 니 다 (모든 기계 의 밀리초 수가 기본적으로 일치 하지 않 음 에 틀림없다).인자 System. currentTimeMillis (): 이것 은 자바 에서 1970 년 부터 지금까지 의 밀리초 수 를 얻 은 13 자리 숫자 입 니 다. Date. getTime () 함수 의 결과 와 마찬가지 로 1378049585093 입 니 다.연 구 를 통 해 2013 년 에 3 위 는 137 이 었 고 2023 년 에 168 이 었 으 며 2033 년 에 야 199 였 습 니 다. 그래서 저 는 첫 번 째 숫자 1 을 빼 고 자 리 를 차지 하지 않 기로 결 정 했 습 니 다.절대 다수의 시스템 이 10 년 20 년 이 걸 리 지 않 을 것 이 라 고 확신 할 수 있다.이렇게 해서 매개 변수 2 는 12 자리 수의 숫자 가 되 었 고 매개 변수 1machineId 를 더 하면 13 자리 에 불과 하 다.매개 변수 System. nanoTime (): 이것 은 자바 안의 납 초 수 입 니 다. 깊이 있 는 연 구 를 통 해 같은 밀리초 안에 위치 7, 8, 9 라 는 세 가지 숫자 가 변화 할 것 입 니 다.그래서 이 세 숫자 를 캡 처 해서 16 자리 주문 번 호 를 맞 추기 로 했 습 니 다.결론: 이론 적 으로 이 방안 은 같은 초 에 1000 * 1000 개의 주문 번 호 를 대응 할 수 있 지만 테스트 를 통 해 초당 2000 개의 중복 이 발생 할 수 있다.
3. 선택 가능 한 방안 2
이 프로젝트 는 hashCode 를 만 들 기 위해 세 션 ID (sessionId) 를 가 져 오 는 것 을 사용 합 니 다.알고리즘:
OrderId=
machineId+
session().getId().hashCode();

설명: 매개 변수 machineId 는 더 이상 설명 하지 않 고 방안 과 일치 합 니 다.인자 2 session (). getId (). hashCode () 는 웹 시스템 에서 사용자 브 라 우 저 와 웹 용기 의 유일한 세 션 번 호 를 가 져 오고 이 세 션 ID 를 이 문자열 의 hashCode 값 으로 변환 합 니 다. 예 를 들 어 1939354961.이 값 은 11 자리 나 10 자리 일 수도 있 고, 앞 에 서 는 - 번호 가 나 올 수도 있 습 니 다. 즉, 이 값 이 마이너스 일 수도 있 습 니 다. 괜 찮 습 니 다. 바로 잡 으 세 요.그리고 이 값 을 왼쪽으로 0 에서 15 자리 까지 보충 하면 기본적으로 자릿수 가 일치 하지 않 는 문제 에 대응 할 수 있다.hashCode 는 jdk 가 대상 의 주소 나 문자열 또는 숫자 에 따라 계산 한 int 형식의 수치 임 을 알 고 있 습 니 다.hashCode 의 값 이 중복 되면 다른 값 이 아니 라 하나의 값 이 라 고 상상 할 수 있 습 니 다.또한 sessionId 는 클 라 이언 트 이 고 브 라 우 저 와 관련 이 있 기 때문에 기본적으로 중복 되 지 않 습 니 다. 그러나 사용자 가 같은 세 션 유효기간 내 에 같은 버 전의 브 라 우 저 를 만 들 면 두 번 생 성 하면 무효 입 니 다. 세 션 ID 가 일치 하기 때 문 입 니 다.요약: 이 알고리즘 은 중복 되 지 않 을 확률 이 낮 지만 같은 세 션 과 브 라 우 저 에서 1 회 이상 주문 번 호 를 만 드 는 문 제 를 스스로 처리 해 야 합 니 다. 이 알고리즘 은 디 버 깅 을 거치 지 않 고 생략 하 였 습 니 다. 방안 3 을 보십시오.
4. 선택 가능 한 방안 3
이 프로젝트 는 세 션 id 대신 UUID 를 사용 하여 프로젝트 2 를 기반 으로 수정 되 었 습 니 다.UUID 는 한 기계 에서 생 성 된 숫자 로, 같은 공중 에 있 는 모든 기계 가 유일 하 다 는 것 을 보증 하 며, 이 반복 되 지 않 는 것 은 전 세계 사람들 이 모두 알 고 있다.물론 문자열 값 이 중복 되 지 않 는 이상 해당 하 는 hashCode 도 마찬가지 로 중복 되 지 않 습 니 다.알고리즘:
OrderId=
machineId+
UUID.randomUUID().toString().hashCode();

설명: 매개 변수 1 은 더 이상 설명 하지 않 습 니 다.인자 2 는 UUID 를 생 성하 고 hashCode 값 을 가 져 오 는 값 입 니 다. 테스트 를 통 해 전혀 문제 가 없습니다.1000 w 의 동시 다발 을 열 어 삽입 을 테스트 할 수 있 습 니 다. 데이터 베이스 가 유일한 오 류 를 보고 하지 않 는 다 면 문제 가 없습니다.결론: hashCode 라 는 알고리즘 은 소프트웨어 를 만 드 는 것 부터 지금까지 이렇게 많은 해 동안 도움 이 되 지 못 했 는데 이번에 크게 사용 되 었 습 니 다.문 제 를 해결 하 다.동지 들 은 앞으로 이 물건 을 잘 써 주세요.5. 부록: 방안 3 의 알고리즘 코드
6、	public static String getOrderIdByUUId() {
7、			int machineId = 1;//    1-9       
8、			int hashCodeV = UUID.randomUUID().toString().hashCode();
9、			if(hashCodeV < 0) {//      
10、				hashCodeV = - hashCodeV;
11、			}
12、			// 0       0     
13、			// 4      4     
14、			// d         
15、			return machineId+String.format("%015d", hashCodeV);
16、		}

방안 3 은 사실 하나의 함수 로 매우 간편 하 다.
마지막: 이것 은 미 지 의 사람의 사상 에서 유래 한 것 으로 그의 주 소 를 기억 하지 못 한다.

좋은 웹페이지 즐겨찾기