데이터 베이스 Redis Redis 전류 제한을 구현하는 방법에는 몇 가지가 있습니까?

Redis 전류 제한을 구현하는 방법에는 몇 가지가 있습니까?

Jun 30, 2020 pm 01:28 PM
redis 전류 제한

redis 전류 제한을 구현하는 방법에는 다음 세 가지가 있습니다. 1. Redis의 setnx 작업을 기반으로 지정된 키에 대한 만료 방식을 설정합니다. 2. Redis 데이터 구조 zset을 기반으로 요청이 이루어집니다. zset array; 3. Redis의 토큰 버킷 알고리즘에 따라 출력 속도가 입력 속도보다 크면 흐름이 제한되어야 합니다.

Redis 전류 제한을 구현하는 방법에는 몇 가지가 있습니까?

Redis 전류 제한을 구현하는 방법에는 3가지가 있습니다. setnx 명령 CAS(비교 및 교체) 작업 중에 지정된 키에 대해 만료 관행(만료)이 설정됩니다. 전류 제한의 주요 목적은 내 코드 프로그램에 액세스하기 위한 요청이 N개 있는 것입니다. 따라서 setnx를 사용하면 이 기능을 쉽게 얻을 수 있습니다.

예를 들어, 10초 내에 20개의 요청을 제한해야 하는 경우 setnx를 설정할 때 만료 시간을 10으로 설정할 수 있습니다. 요청된 setnx 수가 20에 도달하면 현재 제한 효과가 달성됩니다. 코드는 비교적 간단하므로 표시하지 않습니다.

물론 이 접근 방식에는 많은 단점이 있습니다. 예를 들어 1~10초를 계산할 때 N초 내에 M개의 요청을 계산해야 한다면 N을 유지해야 합니다. Redis Key 및 기타 문제

관련 학습 권장 사항:

redis 비디오 튜토리얼

두 번째: Redis 기반 데이터 구조 zset

실제로 전류 제한과 관련된 가장 중요한 것은 슬라이딩 윈도우입니다. 위에서도 언급한 내용인데 어떻게 1-10이 2-11이 되었나요? 실제로 시작 값과 끝 값은 모두 각각 +1입니다.

그리고 Redis의 목록 데이터 구조를 사용하면 이 기능을 쉽게 구현할 수 있습니다.

요청을 zset 배열로 만들 수 있으며, 각 요청이 들어올 때 값은 고유하게 유지되며 UUID로 생성될 수 있습니다. 점수를 사용할 수 있습니다. 현재 타임스탬프 내의 요청 수를 계산하는 데 점수를 사용할 수 있기 때문에 현재 타임스탬프가 나타납니다. zset 데이터 구조는 2 타임스탬프 내의 요청 수를 쉽게 얻을 수 있도록 범위 메서드도 제공합니다

코드는 다음과 같습니다

public Response limitFlow(){
        Long currentTime = new Date().getTime();
        System.out.println(currentTime);
        if(redisTemplate.hasKey("limit")) {
            Integer count = redisTemplate.opsForZSet().rangeByScore("limit", currentTime -  intervalTime, currentTime).size();        // intervalTime是限流的时间 
            System.out.println(count);
            if (count != null && count > 5) {
                return Response.ok("每分钟最多只能访问5次");
            }
        }
        redisTemplate.opsForZSet().add("limit",UUID.randomUUID().toString(),currentTime);
        return Response.ok("访问成功");
    }
로그인 후 복사

위 코드를 통해 슬라이딩 윈도우 효과를 얻을 수 있으며, N초마다 보장됩니다. 최대 M개의 요청에서는 zset의 데이터 구조가 점점 더 커지는 단점이 있습니다. 구현 방법은 비교적 간단합니다.

세 번째 유형: Redis 기반 토큰 버킷 알고리즘

전류 제한에 관해서라면 토큰 버킷 알고리즘을 언급해야 합니다. 토큰 버킷 알고리즘은 버킷 알고리즘이라고도 합니다. 자세한 내용은 Du Niang의 설명을 참조하세요. 토큰 버킷 알고리즘

토큰 버킷 알고리즘은 입력 비율보다 출력 비율이 높을 때 언급됩니다. 트래픽 제한이 초과되었습니다.

즉, 요청에 액세스할 때마다 Redis에서 토큰을 얻을 수 있다는 것은 한도를 초과하지 않았다는 의미이고, 얻을 수 없으면 결과는 반대가 된다는 의미입니다. .

위의 아이디어를 바탕으로 Redis의 List 데이터 구조를 결합하여 이러한 코드를 쉽게 구현할 수 있습니다.

목록의 leftPop을 사용하여 토큰을 얻습니다.

// 输出令牌
public Response limitFlow2(Long id){
        Object result = redisTemplate.opsForList().leftPop("limit_list");
        if(result == null){
            return Response.ok("当前令牌桶中无令牌");
        }
        return Response.ok(articleDescription2);
    }
로그인 후 복사

그런 다음 Java의 예약된 작업을 사용하여 정기적으로 rightPush를 수행합니다. List 는 물론 토큰도 고유해야 하므로 여기서는 여전히 UUID를 사용하여 생성합니다.

// 10S的速率往令牌桶中添加UUID,只为保证唯一性
    @Scheduled(fixedDelay = 10_000,initialDelay = 0)
    public void setIntervalTimeTask(){
        redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString());
    }
로그인 후 복사

요약하자면, 현재 제한 방법의 경우 코드 구현을 시작하는 것이 어렵지 않습니다. 인터페이스의 흐름을 제한하고 궁극적으로 웹사이트를 보호하기 위해 AOP 또는 필터를 사용합니다.

Redis는 실제로 캐싱 및 분산 잠금 기능뿐만 아니라 다른 용도로도 많이 사용됩니다. 데이터 구조는 단순히 String, Hash, List, Set 및 Zset이 아닙니다. 관심 있는 사람들은 그의 GeoHash 알고리즘, BitMap, HLL 및 Bloom 필터 데이터(Redis 4.0 이후에 추가됨, Docker를 사용하여 redislabs/rebloom을 직접 설치할 수 있음) 구조에 대해 후속 조치를 취할 수 있습니다.

궁금한 점이 있으시면 메시지를 남겨주세요

위 내용은 Redis 전류 제한을 구현하는 방법에는 몇 가지가 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Redis로 모든 데이터를 정리하는 방법 Redis로 모든 데이터를 정리하는 방법 Apr 10, 2025 pm 05:06 PM

모든 Redis 데이터를 청소하는 방법 : Redis 2.8 이상 : Flushall 명령은 모든 키 값 쌍을 삭제합니다. Redis 2.6 이상 : DEL 명령을 사용하여 키를 하나씩 삭제하거나 Redis 클라이언트를 사용하여 메소드를 삭제하십시오. 대안 : Redis 서비스를 다시 시작하거나 (주의해서 사용) Redis 클라이언트 (예 : Flushall () 또는 FlushDB ())를 사용하십시오.

Redis의 다른 사례가 어떻게 의사 소통하는지 Redis의 다른 사례가 어떻게 의사 소통하는지 Apr 10, 2025 pm 05:15 PM

Redis 인스턴스 간의 커뮤니케이션을위한 몇 가지 메커니즘이 있습니다 : Pub/Sub : Publish/Sub Mode, 효율적이고 낮은 긴장 메시징이 가능합니다. 클러스터 모드 : 분산 배포 방법, 고 가용성 및 결함 공차를 제공합니다. 크로스 인스턴스 명령 : 임시 운영 또는 관리 목적에 적합한 명령을 다른 인스턴스로 직접 전송할 수 있습니다.

현재 Redis 버전을 보는 방법 현재 Redis 버전을 보는 방법 Apr 10, 2025 pm 05:09 PM

이 안내서는 현재 Redis 버전을 결정하는 두 가지 방법을 제공합니다. 정보 명령을 사용하여 버전 번호를 얻습니다. -version 옵션을 사용하여 버전 번호를 직접 표시하십시오. 버전 번호는 기본 버전 번호, 보조 버전 번호 및 개정 번호로 구성되며 각각 주요 버전 업데이트, 기능 향상 및 사소한 버그 수정을 나타냅니다.

Redis 클러스터를 다시 시작하는 방법 Redis 클러스터를 다시 시작하는 방법 Apr 10, 2025 pm 05:18 PM

Redis 클러스터 재시작 단계는 다음과 같습니다. 닫고 명확한 데이터 및 로그. 시드 노드를 시작하십시오. 새 클러스터를 만듭니다. 나머지 노드를 추가하십시오. 클러스터 상태를 확인하십시오.

Redis 명령을 다시 시작하는 방법 Redis 명령을 다시 시작하는 방법 Apr 10, 2025 pm 05:21 PM

Redis는 두 가지 방식으로 다시 시작할 수 있습니다. 서비스를 중단하지 않고 원활한 다시 시작하여 클라이언트가 운영을 계속할 수 있습니다. 하드 재시작은 프로세스를 즉시 종료하여 클라이언트가 데이터를 분리하고 손실하게 만듭니다. 심각한 오류를 수정하거나 데이터를 정리 해야하는 경우에만 대부분의 경우 원활한 재시작을 사용하는 것이 좋습니다.

Redis 클러스터는 어떻게 구현됩니까? Redis 클러스터는 어떻게 구현됩니까? Apr 10, 2025 pm 05:27 PM

Redis Cluster는 Redis 인스턴스의 수평 확장을 허용하는 분산 배포 모델이며, 노드 간 통신, 해시 슬롯 디비전 키 공간, 노드 선거, 마스터 슬레이브 복제 및 명령 리디렉션을 통해 구현됩니다. 노드 간 통신 : 가상 네트워크 통신은 클러스터 버스를 통해 실현됩니다. 해시 슬롯 : 키 공간을 해시 슬롯으로 나누어 키를 담당하는 노드를 결정합니다. 노드 선거 : 최소 3 개의 마스터 노드가 필요하며 선거 메커니즘을 통해 하나의 활성 마스터 노드 만 보장됩니다. 마스터 슬레이브 복제 : 마스터 노드는 요청을 작성하고 슬레이브 노드는 요청 및 데이터 복제를 담당합니다. 명령 리디렉션 : 클라이언트는 키를 담당하는 노드에 연결하고 노드는 잘못된 요청을 리디렉션합니다. 문제 해결 : 결함 감지, 라인 마킹 및 재

Redis로 멀티 스레딩을 구현하는 방법 Redis로 멀티 스레딩을 구현하는 방법 Apr 10, 2025 pm 05:12 PM

Redis는 원자로 모드, 스레드 풀 및 내부 멀티 스레딩 메커니즘을 영리하게 결합하여 멀티 스레딩을 통해 멀티 코어 CPU를 효과적으로 활용하여 처리량 개선, 리소스 활용 최적화, 낮은 지연성 유지 및 확장 성 향상 및 다양한 부하 요구를 충족시켜야합니다.

Redis 거래를 처리하는 방법 Redis 거래를 처리하는 방법 Apr 10, 2025 pm 05:24 PM

REDIS 거래는 원자력, 일관성, 격리 및 지속성 (산) 속성을 보장하고 다음과 같이 작동합니다. 트랜잭션 시작 : 다중 명령을 사용하십시오. 레코드 명령 : redis 명령을 여러 개 실행합니다. 커밋 또는 롤백 트랜잭션 : exec 명령을 사용하여 트랜잭션을 커밋하거나 Discard 명령을 사용하여 거래를 롤백합니다. 커밋 : 오류가 없으면 EXEC 명령은 트랜잭션을 저지르고 모든 명령은 데이터베이스에 원자 적으로 적용됩니다. 롤백 : 오류가 있으면 Discard 명령이 트랜잭션을 롤백하고 모든 명령이 폐기되고 데이터베이스 상태는 변경되지 않았습니다.

See all articles