소개
(사람들이 덜 크레이터) 때 오후, 연기 구덩이 형제와 동료는 화장실에서 줄을 기다립니다. 휴대 전화 애타게 언니를 누른 상태에서 내가 라인의 측면이었다 장면을 상상해보십시오. 동료 앞에서, 그는 그의 머리를 돌렸다 나와 함께 채팅을 휴대 전화 문자 메시지를 들고.
우리는 아래의이 짧은 링크의 원칙의 이행을 논의하기 시작했다 그래서 (예, 화장실! 배우고 잊지 않았다).
링크 짧은 클릭 한 후, 우리는 다음 주소로 이동합니다
http://h5.dangdang.com/mix_20191015_or4x
이 문서의 구현 원리에 대해의 이야기를하자!
본문
수요 기원
여기에 당신이 짧은 링크를 필요로하는 이유에 대해 말했다? 그런 당신이 마이크로 블로깅 보낼 때 등이 간단한,
URL 주소가 너무 긴 경우, 분명히 적은 키워드 쓸 수 있습니다!
메시지가 너무 긴 경우 또 다른 예를 들어, 송신 문자 메시지는 다음 메시지는 두 개의 머리로 분할 될 돈을 낭비!
짧은 링크 그래서,뿐만 아니라 매우 아름답고 또한 자원을 절약,하지만!
요청 프로세스
첫째, 우리는 짧은 링크 쿠폰을보고 http://dwz.win/nXR
두 부분으로 구성되어있다
http://dwz.win
: 도메인 이름 시스템 주소 짧은 링크
nXR
: 요청 매개 변수의
요청을 http://dwz.win/nXR
상태로 주소 수익률을 아래와 같이
따라서, 우리는 Qiaoxia 추론 할 수 http://dwz.win/nXR
다음 일이, 어떤 주소를?
여기 슬래그 슬래그 연기가 회전 한 최대 밖으로 말하는 것입니다. 도 짧은 상부 링크 시스템에 나타낸 바와 같이,이 쿠폰 (301)을 사용하는 것을 제외하고는, 상태 (301) 또는 (302)로 복귀 할 수있다.
여기에 내가 말을해야, 우리는 이해해야 그 30X
상태, HTTP 프로토콜에서, 국가의 재 대신.
무엇 301 대표?
301은 영구 리디렉션을 나타낸다. 이 말은 무엇?
GET 요청의 경우, (301 개) 점프는 기본 브라우저 캐시 될 것입니다. 즉, 사용자는 먼저 서버가 301 상태 코드, 다음과 같은 짧은 링크 주소에서 동일한 사용자 여러 번에 다음에 대한 액세스를 반환하는 경우, 브라우저가 직접 뛰어 요청을 해결하지만 짧은 가지 않을 것이다, 짧은 링크에 액세스 링크 시스템을!
분명히 그렇게의 장점은 서버의 압력을 감소하지만, 짧은 주소를 링크 클릭 수를 셀 수 없다.
무엇 (302)는 표현?
(302)는 임시 방향을 나타낸다. 그것은? 무엇을 의미 하는가
GET 요청의 경우, 기본이 캐시 제어에 의해 묵시적 또는 HTTP 응답에 만료되지 않는 한 (302)는 브라우저 캐시, 브라우저 캐시를 이동하지 않습니다. 따라서, 사용자가 동일한 짧은 링크 주소를 액세스 할 때마다 브라우저에서 짧은 링크 시스템을 데리고 갈 것입니다.
이렇게의 장점은 짧은 주소를 클릭 횟수를 계산 할 수 있습니다. 그러나 더 큰 서버의 압력.
그 가장 중요한 기간 다음, 어떻게 http://h5.dangdang.com/mix_20191015_or4x
압축 nXR
문자
알고리즘 이론
첫째는, 우리는 링크의 길이 사이의 대응 관계를 저장하는 테이블이 필요합니다. 다음 테이블 구조
열 이름 | 설명 |
---|---|
신분증 | BIGINT, 자동 증가 기본 키 |
URL | 원래 주소를 점프 할 필요가 긴 주소, |
음,이 시간 우리는 다음과 같은 데이터 테이블을 가정
신분증 | URL |
---|---|
1 | http://h5.dangdang.com/mix_20191015_or4x |
이 | http://h5.dangdang.com/mix_20191102_ad3x |
우리는 짧은 링크로이 시간 증가 ID 키를 가지고. 도메인 이름이 있다고 가정하면 http://dwz.win
상기 요청을 의미 짧은 링크 시스템이다 :
(1)의 http://dwz.win/1
이동 http://h5.dangdang.com/mix_20191015_or4x
,
(2) http://dwz.win/2
이동 http://h5.dangdang.com/mix_20191102_ad3x
;
두 가지 단점은 당신이 받아 들일 수 없다 평가할 것인지가 이렇게 않으며 아니다하세요!
- 데이터는 수백억로, 상대적으로 큰 경우 (1), 그것은 여전히 너무 오래 당신의 URL 주소입니다
- (2) 데이터는 점프 주소를 통과 할 수있는 간단한 스크립트로, 다른 규칙이있다!
상기의 두 가지 단점을 해결하기 위해, 우리는 키 값을 저장하기위한 열을 추가했다. 이 때, 다음과 같은 테이블 구조
열 이름 | 설명 |
---|---|
신분증 | BIGINT, 자동 증가 기본 키 |
키 | 짧은 문자열, 당신은 고유 인덱스를 추가해야 |
URL | 원래 주소를 점프 할 필요가 긴 주소, |
이드 우리가 그것의 길이를 단축 할 수 있고, 일반적으로 그렇게. 때문에 우리의 짧은 링크의 AZ, AZ와 0-9로 62 개 문자의 총 선택됩니다. 따라서, 우리는 디지털 ID의 진수는 16 진수 (62)는, 숫자로 변환되는 등 201,314이 Qn0로 변환 할 수 있음을 말할 수있다.
다음 알고리즘은
private static final String BASE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String toBase62(long num) {
StringBuilder sb = new StringBuilder();
do {
int i = (int) (num % 62);
sb.append(BASE.charAt(i));
num /= 62;
} while (num > 0);
return sb.reverse().toString();
}
또한, 우리는 글로벌 번호까지 다시 글로벌 자동 증가 ID로 발행 소개 할 필요가있다. 우리의 요청에 상응하는 짧은 링크는이 글로벌 시스템의 증가 ID로 이동 한 다음 글로벌 증가가 키와 62 진수 ID 번호입니다 변환합니다.
다음에, 제 2 문제를 해소 할 수있다! 데이터 규칙 문제. 16 진수 62로 변환 한 후 결국, 너무 오래, 데이터 규칙의 문제가 여전히 해결되지 않은 데이터의 문제를 해결한다.
따라서, 우리는 임의의 알고리즘을 도입 할 필요가있다. 이 시간 그래서, 당신은 고려하는 것이 포인트입니다 당신이 키 값을 기준으로 할 경우, 글로벌 안티 id 값의 도입! 다른 임의의 알고리즘을 선택합니다!
(1) 글로벌 안티 ID를 실행하지 않으려는
계산 된 값을 방해하고, 확인을 셔플 알고리즘을 사용합니다. 예를 들어, Qn0에 진수 201314을 변환 할 수 있습니다. 그런 다음 n0Q, Q0n .... 그들 중 하나를 반환 할 수 있습니다 셔플 알고리즘을 사용합니다. 그러나이 충돌의 기회이며, 여행에 여러 번 씻는다.
(2) 글로벌 안티 ID를 시작하기를 희망
하고,이 번호에 Qn0를 얻을 진수로 변환 확인 후. 그 후, 임의의 값으로 유지 위치, 다섯 번째, 열 번째 (등).
추력 리버도 매우 간단 방법에 관해서는, 당신은 진수로 변환 할 수 있습니다 후 짧은 링크 키, 제거의 디지털 고정 된 장소를 얻을합니다.
이 취소 기본적으로 어떻게 키 생성 로직, 이것에 대해 이야기합니다. 그런 다음 사용자는 같은 주소로 링크에 짧은 시간을 클릭 한 http://dwz.win/nXR
짧은 링크 키는 NXR 해당 URL로 돌아갑니다 테이블에 고유 인덱스에 따르면, NXR 시스템입니다 구문 분석합니다.
최적화의 세부 사항
(1) 하위 라이브러리 서브 테이블
시스템이 사용하는 모든 사람들을위한, 공용 네트워크에있는 경우. 하위 라이브러리 하위 테이블에 최대 추천, 1 천만을 통해 데이터의 양이 매우 쉽습니다. 여기 질문에 관해서, 전체 빠 자기 통전 ID 조각난 건강을 얻을, 또는 키가 파편 키를 만들기로 변환 걸릴.
키를 만들기 위해 변환 된 분명히, 샤드 키 쉽습니다. 파편 키와 ID 경우 두 가지 문제가 있습니다!
(1) 사용자 요청 키 ID 역 투영을 다시 수행 할 필요하고 ID에 기반, 응답 시간을 증가, 해당리스트를 찾아 간다.
무작위 선택 알고리즘에 따라 (2)의 키 ID를 반환 할 수있는 값을 추정 할 수있다. 이 경우, 각 테이블은 더 느리게 확인합니다.
그렇게 쉽게, 키 샤드 키으로한다. KEY 제거 URL에 해당하는 테이블에 직접 배치 사용자의 요청을 얻을.
(2) 분리 된 읽기 및 쓰기
와 같은 시스템은, 명확하게 판독 기록보다 훨씬 크다. 그것은 별도의 읽기 및 쓰기를하는 것을 고려해 볼 필요가있다.
(3) 캐시의 도입
가정, 우리는 한 번에 있습니다. 모바일 푸시 SMS 문자 메시지에 대한 링크 후. 물론, 시간의 기간 후에, 짧은 연결 요청의 양이 크게 향상 될 것이다. 모든 데이터베이스 쿼리에 갈 필요가 없습니다, 그것은 레디 스 캐시를 도입 할 수있다.
(4) 글로벌 빠 괜찮 사용되는 다른 알고리즘을
할 수 있습니다. 여기에 단지 전역 적으로 고유 한 ID입니다. 자신의 좋은 견적, 사용은 다른 알고리즘의 성능이 가져 오는 영향을 미칩니다. 그리고 다른 알고리즘의 사용은, 너무 생성 된 ID 생성 규칙을 발생하지 않습니다.
(5) 안티 공격
악의적 인 공격 할 준비는 증가 ID의 값을 방지하기 위해, 모든 밖으로 실행됩니다.
개요
오랜 시간이 문서를 디자인 유형을 기록하지 않았다. 결국, 화장실 구덩이 라인에서 내 동료와 나는 떨어져, 거기 채팅. 마지막으로, 연기 동생 때문에 너무 초점을 맞추고 나중에 자매 종이에지도 동료 대화 기술, 나는 시간이 더 아래에 노트 고아가 없다고 대답했다!
나는 당신이 뭔가를 얻기를 바란다!