• yundream
  • 2018-02-11 14:23:57
  • 2017-10-06 13:52:35
  • 62879

Contents

REDIS Geo API

REDIS 3.2부터 위치기반 데이터를 저장하고 꺼내기 위한 Geo API를 지원한다. (2017년 10월)현재 내가 사용하는 우분투 리눅스 17.04에 설치된 redis 버전은 3.2.1 이다. redis 서버에 접근한 다음 info 명령으로 확인 할 수 있다.
yundream@home:~$ redis-cli 
127.0.0.1:6379> info
# Server
redis_version:3.2.1
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:8ab9de078b62748e
redis_mode:standalone
os:Linux 4.10.0-35-generic x86_64
...

주요 API

모든 GEO API들은 앞에 "GEO"가 붙는다.
  • GEOADD key long lat name [long2 lat2 name2 ... longN latN nameN] : long/lat 좌표를 가진 멤버를 추가한다.
  • GEORADIUS key long lat radius unit [WITHDIST] [WITHHASH] [WITHCOORD] [ASC|DESC] [COUNT count] : 지정된 좌표에서 "반경" 거리 이내의 멤버에 대한 GeoSet을 검색한다.
  • GEORADIUSBYMEMBER key member radius unit [WITHDIST] [WITHHASH] [WITHCOORD] [ASC|DESC] [COUNT count] : GEORADIUS과 달리 GeoSet의 멤버의 좌표를 중심으로 검색한다.
  • GEOPOS key elem1 elem2 ... elemN
  • GEODIST key elem1 elem2 [unit]
  • GEOHASH key elem1 elem2 ... elemN
  • GEOENCODE long lat [radius unit]
  • GEODECODE hash
ASCDESC옵션으로 결과목록을 정렬 할 수 있다.
  • ASC : 올림차순
  • DESC : 내림차순
COUNT <count>옵션으로 출력할 아이템의 갯수를 제한 할 수 있다.

주변 맛집 찾기 시스템 개발

아래와 같은 위치 데이터가 있다.
GEOADD restaurant 127.026272 37.499851 푸켓쌀국수
GEOADD restaurant 127.026615 37.497774 메드포갈릭  
GEOADD restaurant 127.027098 37.499587 아리랑 
GEOADD restaurant 127.028428 37.497868 참치공방 
GEOADD restaurant 127.029297 37.496395 베이징 
나의 위치(127.026993, 37.497933)에서 반경 150m 내에 있는 맛집을 찾고 싶다. 구글 맵상으로 아래와 같이 나타낼 수 있다.

키는 "restaurant"이다. GEO API에서 key는 하나 이상의 멤버를 포함 할 수 있는 "그룹의 키"다. 즉 5개의 식당을 멤버로 가지는 restaurant 키를 만든 경우다.

GEORADIUS 명령을 이용해서 검색을 했다.
127.0.0.1:6379> GEORADIUS restaurant 127.026993 37.497933 150 m WITHDIST
참치공방
126.9455
메드포갈릭
37.6801
127.026993, 37.497933를 원점으로 반경 150m거리에 있는 아이템을 검색했다.
  • WITHDIST : 원점으로 부터의 거리를 출력한다.
  • WITHCOORD : 좌표를 출력한다.
  • WITHHASH : integer 타입의 geohash를 출력한다.
GeoHash를 이용하면 위치에 대한 URL을 서비스 할 수 있을 것이다.
> GEOHASH restaurant 참치공방
1) "wydm6d72bv0"
링크: http://geohash.org/wydm6d72bv0

Redis와 GeoHashing

Redis는 GeoHash로 공간 정보를 색인한다. GeoHash는 생성된 해시 값을 B-Tree의 키로 저장하고 읽을 수 있다. 구현이 쉬운 것에 비해서, 읽기/쓰기 성능이 좋기 때문에 CouchDB, ElasticSearch 등의 데이터베이스도 GeoHash를 지원한다.

GeoHash는 빠르기는 하지만, 고정된 사각형안에 위치정보들이 들어가기 때문에 거리 기반의 쿼리를 내릴 경우 정확도가 떨어질 수 있다. Redis는 이 문제를 인접한 GeoHash 데이터까지 추가적으로 가져와서 연산하는 방식으로 해결 하고 있다. GeoHash 테스터를 이용해서 테스트해 볼 수 있다.

GeoHash의 또 다른 장점은 Consistent Hash를 이용한 분산처리가 쉽다는 점이다. 어떤 위치에 대한 질의가 있으면, 해당 질의를 처리 하는 특정노드로 라우팅 할 수 있다. 이러한 특징을 이용하면 각 지역별로 작동하는 고속의 위치 서비스를 개발 할 수 있다.

참고