멤버 만료로 Redis 세트 생성



Redis은 다양한 유형의 값을 지원하는 우수한 메모리 내 키-값 데이터 저장소입니다. Sorted Sets도 그 중 하나입니다. 문서sorted sets에 따르면 다음과 같습니다.

Sorted sets, similar to Sets but where every string element is associated to a floating number value, called score. The elements are always taken sorted by their score, so unlike Sets it is possible to retrieve a range of elements (for example you may ask: give me the top 10, or the bottom 10).



그들이 sorted sets에 대해 말하지 않은 것은 적어도 이 블로그 게시물이 생성될 때까지 sets members의 만료를 정의할 수 없다는 것입니다. 만료sets members를 정의해야 하는 이유는 무엇입니까?

제 경우에는 특정 제한이 있는 사용자에게 전송되는 OTP를 생성하고 확인할 수 있는 전화 서비스를 만들어야 했습니다. 이전 디자인은 Golang Rate Limit을 사용하고 있어서 수평 확장이 불가능하다고 생각했습니다. 그래서 이 경우에 Redis를 사용할 것이라고 생각했습니다. OTP 생성 요구 사항은 다음과 같습니다.
  • 각 전화번호는 X times당 최대 Y minutes개의 OTP를 요청할 수 있습니다.

  • 그래서 Redis sets를 생각해냈지만 sets members는 자체 만료 시간을 가질 수 없습니다. 그런 다음 this issue comment에 의해 @pietern을 찾을 때까지 인터넷 검색을했습니다. 이것은 꽤 해키한 움직임이지만 최소한 실행 가능합니다. 그래서 그것을 구현하려고 노력했습니다. 다시 한 번 Github에 대한 댓글이 제 직업을 구했습니다.

    정렬된 세트의 점수를 만기 밀리초로 사용하는 아이디어는 매우 간단합니다. 점수가 current milliscurrent millis + Y minutes 사이인 유효한 멤버를 가져오고 점수가 0 과 current millis 사이인 만료된 멤버를 제거합니다. 따라서 최소 의사 코드는 다음과 같습니다.

    # define variables
    timeLimit := Y
    requestLimit := X
    key := +6212312341234
    otp := randomString(6)
    now := currentMillis()
    exp := now + timeLimit
    
    # get total of generated phone number in key
    validOTPs := redisQuery("ZRANGEBYSCORE $key $now $exp")
    
    # Limitting request
    if count(validOTPs) >= requestLimit
    then exit
    
    # Add members to key
    redisQuery("ZADD $key $exp $otp")
    
    


    나는 이 방법이 충분히 훌륭하고 구현하기에 가장 간단한 방법이라고 생각합니다. adding expiration to the key 또는 removing members that are no longer valid 와 같은 선택적 작업을 추가할 수 있습니다. 하지만 이 작업은 sets member에 만료를 추가하기에 충분합니다. 이 방법을 사용하여 무차별 대입을 방지하기 위해 OTP 인증을 제한할 수도 있습니다.

    좋은 웹페이지 즐겨찾기