복붙노트

[REDIS] 레디 스에서 매장 IP 범위

REDIS

레디 스에서 매장 IP 범위

나는 IP의 많은 다른 업체의 범위를 가지고있다. 예를 들면

P1: 192.168.1.10 - 192.168.1.50, 192.168.2.16 - 192.168.2.49,
P2: 17.36.15.34 - 17.36.15.255,
P3: ...

나는 INT32이 IP 변환 :

P1: 3232235786 - 3232235826, 3232236048 - 3232236081, etc

내 작업 : 사용자의 IP 주소를 제공 이름을 찾으려면 (예 : 192.168.2.20 (대한 3232236052))

MySQL의 그것은 간단합니다 :

select name from ip_ranges where l_ip <= user_ip and user_ip <= r_ip

어떻게 레디 스와 동일한 기능을 수행 할?

해결법

  1. ==============================

    1.당신이 당신의 IP 범위가 겹치거나 할 수없는 고려한다면 그것은 의존한다. 그렇지 않은 경우, 해결책은 아주 간단합니다 :

    당신이 당신의 IP 범위가 겹치거나 할 수없는 고려한다면 그것은 의존한다. 그렇지 않은 경우, 해결책은 아주 간단합니다 :

    예:

    여기 내 업체입니다. 그들 각각은 ID로 식별됩니다. 나는 각 공급자에 부착 이상의 속성을 추가 할 수 있습니다 :

    > hmset providers:1 name P1 min 3232235786 max 3232235826
    OK
    > hmset providers:2 name P3 min 1232235786 max 1232235826
    OK
    > hmset providers:3 name P3 min 2232235786 max 2232235826
    OK
    > hmset providers:4 name P4 min 4232235786 max 4232235826
    OK
    

    공급자가 시스템에 추가 될 때마다 인덱스는 (수동 :이 레디 스 관계형 데이터베이스가 아닌입니다) 유지해야합니다. 점수는 회원이 상기 범위의 ID이고, 최대 값이다.

    > zadd providers:index 3232235826 1 1232235826 2 2232235826 3 4232235826 4
    (integer) 4
    > zrange providers:index 0 -1
    1) "2"
    2) "3"
    3) "1"
    4) "4"
    

    이제 IP 주소에 해당하는 고유 한 범위를 쿼리, 당신은 2 라운드 트립이 필요합니다 :

    > zrangebyscore providers:index 3232235787 +inf LIMIT 0 1
    1) "1"
    > hgetall providers:1
    1) "name"
    2) "P1"
    3) "min"
    4) "3232235786"
    5) "max"
    6) "3232235826"
    

    그런 다음 클라이언트 프로그램은 당신의 IP가 반환 범위의 최소 주소보다 크거나 같은 것을 확인할 수있다.

    당신은 범위가 겹칠 수 있습니다 고려한다면 이제,이 솔루션은 훨씬 더 복잡하며, 이미 여기에서 설명하고있다.

  2. ==============================

    2.내 생각에 가장 좋은 방법은 소트 세트가 될 것입니다.

    내 생각에 가장 좋은 방법은 소트 세트가 될 것입니다.

    범위 사용 ZADD을 삽입합니다. 멤버 할당 RANGE_NAME에. 범위에 할당 가장 높은 값을 점수를합니다.

    ZADD ip_table 3232235826 some_name
    

    그런 다음 MIN_VALUE 및 제한 = 1과 user_ip와 범위 사용 ZRANGEBYSCORE를 찾는.

    ZRANGEBYSCORE ip_table user_ip +inf LIMIT 0 1
    

    그것은보다 크거나 user_ip 같음 엔드 포인트에서 가장 작은 IP와 범위를 찾을 수 있습니다.

  3. ==============================

    3.당신이 MaxMind 같은 공급 업체에 대해이 데이터를 가져 오는 경우, 신속하고 효율적으로이 작업을 수행하기 위해 이미 라이브러리가있을 수 있습니다. 나는 당신이이 경우에 레디 스를 사용하여 많은 성과를 얻을 수 있습니다 생각하지 않습니다.

    당신이 MaxMind 같은 공급 업체에 대해이 데이터를 가져 오는 경우, 신속하고 효율적으로이 작업을 수행하기 위해 이미 라이브러리가있을 수 있습니다. 나는 당신이이 경우에 레디 스를 사용하여 많은 성과를 얻을 수 있습니다 생각하지 않습니다.

  4. ==============================

    4.이것은, 디디에 치아가 제안 된 것과 유사하다 그러나 우리는 "격차"가있을 수 있기 때문에, 소트 세트의 범위와 끝 범위를 시작하십시오.

    이것은, 디디에 치아가 제안 된 것과 유사하다 그러나 우리는 "격차"가있을 수 있기 때문에, 소트 세트의 범위와 끝 범위를 시작하십시오.

    https://github.com/nmmmnu/GeoIP-Redis

  5. from https://stackoverflow.com/questions/9989023/store-ip-ranges-in-redis by cc-by-sa and MIT license