단일 IP 또는 단일 사용자가 1분에 액세스할 수 있는 횟수와 같이 API 또는 페이지에 대한 액세스 빈도를 제한해야 하는 경우가 있습니다. 이러한 요구 사항은 Redis를 사용하여 쉽게 구현할 수 있습니다.
전략 1:
redis에 카운트 값(int)을 저장합니다. 키는 user:$ip이고 값은 처음 키를 설정할 때 해당 IP에 액세스한 횟수입니다. , 세트가 만료됩니다.
카운트에 1을 추가하기 전에 키가 존재하지 않는지 확인하십시오. 1. IP에 액세스하지 않았습니다. 2. IP에 액세스했지만 키가 만료되었습니다. 그런 다음 이번에는 만료를 다시 설정해야 합니다.
사용자가 접속한 경우 count 값이 상한값보다 큰지 확인하여 상한값보다 낮으면 요청을 처리하고, 그렇지 않으면 요청 처리를 거부합니다.
전략 2:
이 상황을 고려하여 사용자가 60초 내에 100회만 접속하도록 허용한다고 가정하면, 사용자가 1초에 1회 접속하고 59초에 99회 접속하면 61번째에 접속하게 됩니다. 둘째, 100번 액세스되었습니다.
정책 1에 따라 처리하면 1초부터 60초 사이에 100개의 요청이 수신되었고, 61초에 100개의 요청이 수신되었으므로 62~120 기간 동안에는 이 IP에 대한 요청이 더 이상 처리되지 않습니다.
문제 없을 것 같지만 잘 생각해보면 59초에서 61초 사이에 99+100=199개의 요청이 접수되었고, 시간 간격은 고작 3초에 불과합니다. 이 경우 원래 디자인에 문제가 있습니다.
해결 방법: redis의 목록(양방향 대기열) 데이터 구조를 사용할 수 있습니다. 핵심은 user:$ip입니다. 즉, 각 IP에 대해 양방향 대기열이 설정됩니다. :
1. 목록의 요소 수가 100개 미만인 경우 요청이 도착할 때의 타임스탬프 L이 목록에 푸시됩니다.
2. 목록에 100개 이상의 요소가 있는 경우 100개 요청 중 가장 빠른 요청의 타임스탬프인 가장 오른쪽의 Lindex(-1)를 꺼냅니다. 타임스탬프 차이가 60초를 초과하면 첫 번째 요청이 만료되었음을 의미하며 첫 번째 요청은 Rpop에서 대기열에서 제외됩니다. 그런 다음 현재 타임스탬프를 Lpush에 추가합니다.
더 많은 Redis 지식을 알고 싶다면 redis 입문 튜토리얼 칼럼을 주목해 주세요.
위 내용은 Redis에서 IP 액세스 수를 제한하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!