Redis - Geo


이 포스트는 Redis 의 데이터 타입 중 하나인 Geo 타입에 대해 알아본다.


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, default
  • km
  • mi: mile
  • ft: 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, default
  • km
  • mi: mile
  • ft: 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

ZRANGERedis - Sorted Set1.2. ZRANGE, ZREVRANGE 를 참고하세요.

ZREMRedis - Sorted Set1.9. ZREM, ZREMRANGEBYRANK, ZREMRANGEBYSCORE 를 참고하세요.

ZCARDRedis - Sorted Set1.5. ZCARD 를 참고하세요.


참고 사이트 & 함께 보면 좋은 사이트

본 포스트는 주종면 저자의 빅데이터 저장 및 분석을 위한 NoSQL & Redis를 기반으로 스터디하며 정리한 내용들입니다.






© 2020.08. by assu10

Powered by assu10