[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.당신이 당신의 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.내 생각에 가장 좋은 방법은 소트 세트가 될 것입니다.
내 생각에 가장 좋은 방법은 소트 세트가 될 것입니다.
범위 사용 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.당신이 MaxMind 같은 공급 업체에 대해이 데이터를 가져 오는 경우, 신속하고 효율적으로이 작업을 수행하기 위해 이미 라이브러리가있을 수 있습니다. 나는 당신이이 경우에 레디 스를 사용하여 많은 성과를 얻을 수 있습니다 생각하지 않습니다.
당신이 MaxMind 같은 공급 업체에 대해이 데이터를 가져 오는 경우, 신속하고 효율적으로이 작업을 수행하기 위해 이미 라이브러리가있을 수 있습니다. 나는 당신이이 경우에 레디 스를 사용하여 많은 성과를 얻을 수 있습니다 생각하지 않습니다.
-
==============================
4.이것은, 디디에 치아가 제안 된 것과 유사하다 그러나 우리는 "격차"가있을 수 있기 때문에, 소트 세트의 범위와 끝 범위를 시작하십시오.
이것은, 디디에 치아가 제안 된 것과 유사하다 그러나 우리는 "격차"가있을 수 있기 때문에, 소트 세트의 범위와 끝 범위를 시작하십시오.
https://github.com/nmmmnu/GeoIP-Redis
from https://stackoverflow.com/questions/9989023/store-ip-ranges-in-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스 데이터베이스에 HSET 및 HMSET 방법의 차이점은 무엇입니까 (0) | 2020.01.13 |
---|---|
[REDIS] 어떻게 레디 스 지속성 저장소를 수행하는? (0) | 2020.01.13 |
[REDIS] 봄 부팅 레디 스 : 어떻게 사용자의 모든 세션을 무효화? (0) | 2020.01.13 |
[REDIS] RQ - 빈 및 삭제 대기열 (0) | 2020.01.13 |
[REDIS] 캐싱 대신하여 MongoDB의 사용하는 이유 레디 스? [닫은] (0) | 2020.01.13 |