Redis - Geo
이 포스트는 Redis 의 데이터 타입 중 하나인 Geo
타입에 대해 알아본다.
- 1.
Geo
- 1.1.
GEOADD
[1.1.1. [ NX
XX
]](#111-nxxx)- 1.1.2. [
CH
]
- 1.2.
GEOPOS
- 1.3.
GEODIST
- 1.4.
GEORADIUSBYMEMBER
,GEORADIUS
- 1.4.1. [
WITHCOORD
] - 1.4.2. [
WITHDIST
] - 1.4.3. [
WITHHASH
] - 1.4.4. [
COUNT
] [1.4.5. [ ASC
DESC
]](#145-ascdesc)- 1.4.6. [
STORE
]
- 1.4.1. [
- 1.5.
GEOHASH
- 1.6.
ZRANGE
,ZREM
,ZCARD
- 참고 사이트 & 함께 보면 좋은 사이트
- 1.1.
1. Geo
- 위치 정보(경도 longitude, 위도 latitude) 데이터를 효율적으로 관리하며 이를 활용하여 위치 정보 데이터의 분석 및 검색에 사용
- 경도와 위도를 입력하여 두 지점의 거리를 구함
- Sorted Set 데이터 구조를 사용하기 때문에 몇 가지 명령은 Sorted Set 의 명령을 그대로 사용할 수 있음 (
ZRANGE
,ZREM
,ZCARD
)
$ pwd
/usr/local/opt/redis/bin
$ brew services start redis
==> Successfully started `redis` (label: homebrew.mxcl.redis)
$ redis-cli
127.0.0.1:6379>
1.1. GEOADD
위도 latitude 와 경도 longitude 를 입력하는 명령어이다.
127.0.0.1:6379> help geoadd
GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]
summary: Add one or more geospatial items in the geospatial index represented using a sorted set
since: 3.2.0
group: geo
127.0.0.1:6379> GEOADD map1 126.97796919999996 37.566535 seoul
(integer) 1
127.0.0.1:6379> GEOADD map1 129.07564160000004 35.1795543 busan
(integer) 1
127.0.0.1:6379> geopos map1 seoul
1) 1) "126.97797149419784546"
2) "37.56653579238348328"
127.0.0.1:6379> geopos map1 busan
1) 1) "129.07564133405685425"
2) "35.17955339053775532"
1.1.1. [NX
|XX
]
NX
: member 가 존재하지 않을 경우에만 추가하도록 하는 옵션, 기존 member 를 수정하지는 않음XX
: member 가 존재하는 경우에만 추가 (Update) 하도록 하는 옵션, 새로운 member 를 추가하지는 않음
NX
127.0.0.1:6379> geopos map1 busan1
1) (nil)
127.0.0.1:6379> GEOADD map1 NX 129.07564160000004 35.1795543 busan1
(integer) 1
127.0.0.1:6379> GEOADD map1 NX 129.07564160000004 35.1795543 busan1
(integer) 0
XX
127.0.0.1:6379> GEOADD map1 XX 130.07564160000004 35.1795543 busan1
(integer) 0
127.0.0.1:6379> GEOADD map1 XX 130.07564160000004 35.1795543 busan2
(integer) 0
127.0.0.1:6379> geopos map1 busan1
1) 1) "130.07564395666122437"
2) "35.17955339053775532"
127.0.0.1:6379> geopos map1 busan2
1) (nil)
1.1.2. [CH
]
추가된 새 elements 갯수에서 변경된 총 elements 의 갯수로 반환 값을 수정한다.
변경된 elements: 새로 추가된 elements + 기존에 존재하는데 score 가 업데이트된 elements
일반적으로
GEOADD
의 반환 값은 추가된 새로운 elements 의 갯수만 계산하며,
CH
옵션을 사용하지 않으면 수정된 갯수는 리턴하지 않는다.
127.0.0.1:6379> GEOADD map1 ch 126.000000 37.566535 seoul 127.000000 38.000000 busan
(integer) 2
127.0.0.1:6379> GEOADD map1 ch 126.000000 37.566535 seoul 127.000000 38.000000 busan
(integer) 0
127.0.0.1:6379> geopos map1 seoul busan
1) 1) "126.00000053644180298"
2) "37.56653579238348328"
2) 1) "126.99999779462814331"
2) "38.0000009925631943"
1.2. GEOPOS
위도 latitude 와 경도 longitude 를 조회하는 명령어이다.
127.0.0.1:6379> help geopos
GEOPOS key member [member ...]
summary: Returns longitude and latitude of members of a geospatial index
since: 3.2.0
group: geo
127.0.0.1:6379> geopos map1 seoul busan
1) 1) "126.00000053644180298"
2) "37.56653579238348328"
2) 1) "126.99999779462814331"
2) "38.0000009925631943"
1.3. GEODIST
두 지역의 거리를 조회하는 명령어이다.
단위는 아래와 같다.
m
: meter, defaultkm
mi
: mileft
: feet
127.0.0.1:6379> help geodist
GEODIST key member1 member2 [M|KM|FT|MI]
summary: Returns the distance between two members of a geospatial index
since: 3.2.0
group: geo
127.0.0.1:6379> geodist map1 seoul
(error) ERR wrong number of arguments for 'geodist' command
127.0.0.1:6379> geodist map1 seoul busan
"100258.1629"
127.0.0.1:6379> geodist map1 seoul busan km
"100.2582"
1.4. GEORADIUSBYMEMBER
, GEORADIUS
지정한 지역의 근처에 있는 도시를 조회하는 명령어이다.
지정한 지역에서 반경 수km 이내의 지역(member) 를 조회한다.
m
: meter, defaultkm
mi
: mileft
: feet
127.0.0.1:6379> help georadiusbymember
GEORADIUSBYMEMBER key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member
since: 3.2.0
group: geo
127.0.0.1:6379> help georadius
GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point
since: 3.2.0
group: geo
GEORADIUSBYMEMBER
127.0.0.1:6379> georadiusbymember map1 seoul 200 km
1) "seoul"
2) "busan"
GEORADIUS
127.0.0.1:6379> georadius map1 127 38 200 km
1) "seoul"
2) "busan"
1.4.1. [WITHCOORD
]
좌표 coordinate 를 조회하는 옵션이다.
127.0.0.1:6379> georadiusbymember map1 seoul 200 km withcoord
1) 1) "seoul"
2) 1) "126.00000053644180298" # withcoord
2) "37.56653579238348328"
2) 1) "busan"
2) 1) "126.99999779462814331"
2) "38.0000009925631943"
1.4.2. [WITHDIST
]
거리를 조회하는 옵션이다.
127.0.0.1:6379> georadiusbymember map1 seoul 200 km withcoord withdist
1) 1) "seoul"
2) "0.0000" # withdist
3) 1) "126.00000053644180298" # withcoord
2) "37.56653579238348328"
2) 1) "busan"
2) "100.2582"
3) 1) "126.99999779462814331"
2) "38.0000009925631943"
1.4.3. [WITHHASH
]
해시값을 조회하는 옵션이다.
127.0.0.1:6379> georadiusbymember map1 seoul 200 km withcoord withdist withhash
1) 1) "seoul"
2) "0.0000" # withdist
3) (integer) 4077178836315240 # withhash
4) 1) "126.00000053644180298" # withcoord
2) "37.56653579238348328"
2) 1) "busan"
2) "100.2582"
3) (integer) 4077617702094415
4) 1) "126.99999779462814331"
2) "38.0000009925631943"
1.4.4. [COUNT
]
조회할 지역 (member) 의 수를 선택하는 옵션이다.
127.0.0.1:6379> georadiusbymember map1 seoul 200 km withcoord withdist withhash count 1
1) 1) "seoul"
2) "0.0000"
3) (integer) 4077178836315240
4) 1) "126.00000053644180298"
2) "37.56653579238348328"
127.0.0.1:6379> georadiusbymember map1 seoul 200 km withcoord withdist withhash count 2
1) 1) "seoul"
2) "0.0000"
3) (integer) 4077178836315240
4) 1) "126.00000053644180298"
2) "37.56653579238348328"
2) 1) "busan"
2) "100.2582"
3) (integer) 4077617702094415
4) 1) "126.99999779462814331"
2) "38.0000009925631943"
1.4.5. [ASC
|DESC
]
127.0.0.1:6379> georadiusbymember map1 seoul 200 km withcoord withdist withhash count 2 desc
1) 1) "busan"
2) "100.2582"
3) (integer) 4077617702094415
4) 1) "126.99999779462814331"
2) "38.0000009925631943"
2) 1) "seoul"
2) "0.0000"
3) (integer) 4077178836315240
4) 1) "126.00000053644180298"
2) "37.56653579238348328"
127.0.0.1:6379> georadiusbymember map1 seoul 200 km withcoord withdist withhash count 2 asc
1) 1) "seoul"
2) "0.0000"
3) (integer) 4077178836315240
4) 1) "126.00000053644180298"
2) "37.56653579238348328"
2) 1) "busan"
2) "100.2582"
3) (integer) 4077617702094415
4) 1) "126.99999779462814331"
2) "38.0000009925631943"
1.4.6. [STORE
]
결과를 저장하는 옵션으로 WITH 옵션과 같이 사용할 수 없다.
127.0.0.1:6379> georadiusbymember map1 seoul 200 km withcoord withdist withhash count 2 asc store map2
(error) ERR STORE option in GEORADIUS is not compatible with WITHDIST, WITHHASH and WITHCOORD options
127.0.0.1:6379> georadiusbymember map1 seoul 200 km count 2 asc store map2
(integer) 2
127.0.0.1:6379> geopos map2 seoul
1) 1) "126.00000053644180298"
2) "37.56653579238348328"
127.0.0.1:6379>
1.5. GEOHASH
해시값을 조회하는 명령어이다.
GeoHash 는 52 bits 정수로부터 encoding 된 11자리 문자열이다.
http://geohash.org/wydm9qy8cj0 를 클릭하면 지도에 위치가 표시된다.
127.0.0.1:6379> help geohash
GEOHASH key member [member ...]
summary: Returns members of a geospatial index as standard geohash strings
since: 3.2.0
group: geo
127.0.0.1:6379> geohash map1 seoul
1) "wy9teny2uv0"
1.6. ZRANGE
, ZREM
, ZCARD
ZRANGE
는 Redis - Sorted Set 의 1.2.ZRANGE
,ZREVRANGE
를 참고하세요.
ZREM
는 Redis - Sorted Set 의 1.9.ZREM
,ZREMRANGEBYRANK
,ZREMRANGEBYSCORE
를 참고하세요.
ZCARD
는 Redis - Sorted Set 의 1.5.ZCARD
를 참고하세요.
참고 사이트 & 함께 보면 좋은 사이트
본 포스트는 주종면 저자의 빅데이터 저장 및 분석을 위한 NoSQL & Redis를 기반으로 스터디하며 정리한 내용들입니다.
- 빅데이터 저장 및 분석을 위한 NoSQL & Redis
- 빅데이터 저장 및 분석을 위한 NoSQL & Redis - 실습파일
- Redis Gate - Geo
- https://redis.io/commands
- https://redis.io/commands - geo