2017-05-15 12 views
1

Redi를 사용하여 나머지 API에서 속도 제한을 원합니다. 당신이 나에게 제안 해 주실 래요, redis의 어떤 데이터 구조가 적절할 것입니다. 방금 키와 값을 업데이트 한 후에 요소를 만료시킬 수없는 RedisTemplate을 사용했습니다.Java Redis Rate limiting

답변

1

일반적인 "ops/초"제한에서부터 특정 해상도의 게시물 수와 같은 낮은 해상도의 미세한 제한에 이르기까지 달성하려는 목표에 따라 여러 가지 방법이 있습니다.

내가 좋아하는 한 가지 매우 간단하고 우아한 방법은 만료 카운터입니다. 이 기법은 간단하며 INCR이 키의 만료 시간을 변경하지 않는다는 사실을 이용합니다. 따라서 기본적으로 리소스에서 초당 1000 개의 요청을 원한다면 INCR을 실행하여 숫자 1로 키를 생성하고 초 단위로 만료 시키십시오. 그런 다음 각 요청에 대해 1000에 도달했는지 확인하고 증가하지 않았 으면 확인하십시오. 그것이있는 경우 - 요청을 차단하십시오. 시간 창이 지나면 키는 자동으로 만료되고 다음 요청시 다시 작성됩니다.

의사 코드의 관점에서

알고리즘은 다음

def limit(resource_key): 

    current = GET(resource_key) 
    if current != NULL and current >= 1000: 
     return ERROR 
    else: 
     value = INCR(resource_key) 
     IF value == 1: 
      EXPIRE(value,1) 

     return OK