Redis Geospatial 실습: 좌표 기반 데이터 처리

2024. 9. 11. 10:42·DB/Redis

첨부된 이미지에서 Redis 명령어와 출력 결과를 분석해 드리겠습니다. Redis의 GEO 명령어는 특정 위치의 좌표를 관리하고, 두 지점 사이의 거리를 계산하거나 특정 좌표를 기준으로 가까운 지점을 검색하는 등의 기능을 제공합니다. 아래는 각 명령어와 결과에 대한 설명입니다.

1. GEOADD: 위치 추가

GEOADD stores:geo 127.029855306619755 37.49911212874 awesomePlace1
(integer) 1
  • 설명: GEOADD는 지정된 키(stores:geo)에 위도, 경도 좌표를 추가합니다. 여기서는 경도 127.029855306619755와 위도 37.49911212874에 "awesomePlace1"라는 이름을 가진 장소를 추가합니다.
  • 결과: (integer) 1은 1개의 좌표가 성공적으로 추가되었음을 의미합니다.
GEOADD stores:geo 127.033352387619 37.491921163986234 awesomePlace2
(integer) 1
  • 설명: "awesomePlace2"라는 장소를 경도 127.033352387619와 위도 37.491921163986234에 추가합니다.
  • 결과: (integer) 1은 성공적으로 추가되었음을 나타냅니다.

2. GEODIST: 두 지점 간의 거리 계산

GEODIST stores:geo awesomePlace1 awesomePlace2
"856.8069"
  • 설명: GEODIST 명령어는 두 지점(awesomePlace1, awesomePlace2) 사이의 거리를 계산합니다. 기본적으로 미터 단위로 반환됩니다.
  • 결과: "856.8069"은 두 지점 사이의 거리가 약 856.8 미터임을 나타냅니다.
GEODIST stores:geo awesomePlace1 awesomePlace2 m
"856.8069"
  • 설명: 여기서는 명시적으로 m(미터) 단위로 두 지점 사이의 거리를 계산합니다. 기본 값과 동일하게 미터 단위로 반환됩니다.
  • 결과: "856.8069"은 동일한 거리 값을 나타냅니다.
GEODIST stores:geo awesomePlace1 awesomePlace2 km
"0.8568"
  • 설명: km(킬로미터) 단위로 두 지점 사이의 거리를 계산합니다.
  • 결과: "0.8568"은 두 지점 사이의 거리가 약 0.8568 킬로미터임을 의미합니다.
GEODIST stores:geo awesomePlace1 awesomePlace2 mi
"0.5324"
  • 설명: 이번에는 mi(마일) 단위로 거리를 계산합니다.
  • 결과: "0.5324"은 두 지점 사이의 거리가 약 0.5324 마일임을 나타냅니다.
GEODIST stores:geo awesomePlace1 awesomePlace2 ft
"2811.0462"
  • 설명: ft(피트) 단위로 거리를 계산합니다.
  • 결과: "2811.0462"은 두 지점 사이의 거리가 약 2811.0462 피트임을 나타냅니다.

3. GEOSEARCH: 지정된 좌표에서 반경 내의 지점 검색

GEOSEARCH stores:geo FROMLONLAT 127.033 37.495 BYRADIUS 100 m
(empty array)
  • 설명: GEOSEARCH 명령어는 지정된 좌표(127.033, 37.495)를 기준으로 100 미터 반경 내의 지점을 검색합니다.
  • 결과: (empty array)는 이 범위 내에 지점이 없음을 의미합니다.
GEOSEARCH stores:geo FROMLONLAT 127.033 37.495 BYRADIUS 300 m
(empty array)
  • 설명: 이번에는 반경을 300 미터로 확장하여 지점을 검색하지만, 여전히 결과가 없습니다.
  • 결과: (empty array).
GEOSEARCH stores:geo FROMLONLAT 127.033 37.495 BYRADIUS 500 m
1) "awesomePlace2"
  • 설명: 반경을 500 미터로 설정하자, "awesomePlace2"가 검색됩니다.
  • 결과: "awesomePlace2"이 이 범위 내에 존재합니다.
GEOSEARCH stores:geo FROMLONLAT 127.033 37.495 BYRADIUS 1500 m
1) "awesomePlace2"
2) "awesomePlace1"
  • 설명: 반경을 1500 미터로 확장하면 "awesomePlace2"뿐만 아니라 "awesomePlace1"도 검색됩니다.
  • 결과: "awesomePlace2", "awesomePlace1"이 검색됩니다.

요약:

  • GEOADD: 지정된 좌표에 위치를 추가합니다.
  • GEODIST: 두 지점 사이의 거리를 다양한 단위(미터, 킬로미터, 마일, 피트)로 계산할 수 있습니다.
  • GEOSEARCH: 지정된 좌표에서 특정 반경 내의 위치를 검색할 수 있습니다.

이 명령어들은 주로 지도 기반의 서비스나 근처에 있는 특정 위치를 검색하는 기능을 구현할 때 유용하게 사용됩니다.


자바 코드 실습

package org.example;

import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.args.GeoUnit;
import redis.clients.jedis.params.GeoSearchParam;
import redis.clients.jedis.resps.GeoRadiusResponse;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");

        try(var jedisPool = new JedisPool("127.0.0.1", 6379)) {
            try(var jedis = jedisPool.getResource()) {
                // geo add
                jedis.geoadd("stores2:geo",127.02985530619755, 37.49911212874, "some1");
                jedis.geoadd("stores2:geo",127.0333352287619, 37.491921163986234, "some2");

                // geo dist
                Double geodist = jedis.geodist("stores2:geo", "some1", "some2");
                System.out.println(geodist);

                // geo search
                List<GeoRadiusResponse> radiusResponseList = jedis.geosearch(
                        "stores2:geo",
                        new GeoCoordinate(127.033, 37.495),
                        500,
                        GeoUnit.M
                );

                List<GeoRadiusResponse> radiusResponseList1 = jedis.geosearch("stores2:geo",
                        new GeoSearchParam()
                                .fromLonLat(new GeoCoordinate(127.033, 37.495))
                                .byRadius(500, GeoUnit.M)
                                .withCoord()
                );

                radiusResponseList1.forEach(response ->
                        System.out.println("%s %f %f".formatted(
                                response.getMemberByString(),
                                response.getCoordinate().getLatitude(),
                                response.getCoordinate().getLongitude())
                        ));

                jedis.unlink("stores2:geo");
            }
        }
    }
}

이 코드는 Redis의 GEO 기능을 활용하여 Jedis 라이브러리를 통해 위치 데이터를 저장하고 조회하는 기능을 구현한 예제입니다. 아래는 각 부분에 대한 설명입니다.


1. 위치 데이터 추가 (GEOADD)

jedis.geoadd("stores2:geo", 127.02985530619755, 37.49911212874, "some1");
jedis.geoadd("stores2:geo", 127.0333352287619, 37.491921163986234, "some2");
  • 설명: geoadd 메서드는 GEOADD 명령어에 해당하며, 특정 위치의 경도, 위도, 이름(여기서는 "some1", "some2")을 Redis의 Sorted Set에 추가합니다.
  • 목적: Redis의 GEO 기능을 이용하여 지정된 좌표에 상점이나 장소 등의 이름을 저장할 수 있습니다.

2. 두 지점 간 거리 계산 (GEODIST)

Double geodist = jedis.geodist("stores2:geo", "some1", "some2");
System.out.println(geodist);
  • 설명: geodist 메서드는 GEODIST 명령어에 해당하며, "some1"과 "some2" 두 지점 사이의 거리를 계산합니다. 기본 단위는 미터(m)입니다.
  • 목적: 두 지점 사이의 정확한 거리를 계산할 수 있으며, 이를 통해 두 장소의 실제 거리를 확인하거나 가까운 위치를 찾는 데 사용할 수 있습니다.

3. 지정된 좌표 주변에서 반경 내 위치 검색 (GEOSEARCH)

List<GeoRadiusResponse> radiusResponseList = jedis.geosearch(
        "stores2:geo",
        new GeoCoordinate(127.033, 37.495),
        500,
        GeoUnit.M
);
  • 설명: geosearch 메서드는 주어진 좌표 (127.033, 37.495)에서 반경 500미터(GeoUnit.M) 내에 있는 위치들을 검색합니다.
  • 목적: 특정 지점에서 일정 반경 내의 상점, 지점 등을 검색하는 기능을 구현할 수 있습니다.

4. 지정된 좌표와 상세 검색 (GEOSEARCH with Coordinates)

List<GeoRadiusResponse> radiusResponseList1 = jedis.geosearch("stores2:geo",
        new GeoSearchParam()
                .fromLonLat(new GeoCoordinate(127.033, 37.495))
                .byRadius(500, GeoUnit.M)
                .withCoord()
);
  • 설명: 이 부분은 GEOSEARCH 기능에 추가 옵션을 설정한 것입니다. 좌표를 포함해서 반환되도록 withCoord() 옵션을 사용하고 있습니다.
  • 목적: 주변 반경 내의 장소를 검색하면서 해당 장소의 좌표를 함께 가져올 수 있습니다.
radiusResponseList1.forEach(response ->
        System.out.println("%s %f %f".formatted(
                response.getMemberByString(),
                response.getCoordinate().getLatitude(),
                response.getCoordinate().getLongitude())
        ));
  • 설명: 검색된 반경 내 장소들의 이름과 좌표를 출력합니다.
  • 목적: 검색된 장소의 이름뿐만 아니라, 좌표를 함께 출력함으로써 해당 장소의 정확한 위치 정보를 알 수 있습니다.

5. 데이터 삭제 (UNLINK)

jedis.unlink("stores2:geo");
  • 설명: unlink 메서드는 Redis의 UNLINK 명령어를 사용하여 "stores2:geo" 키를 삭제합니다. UNLINK는 DEL과 유사하지만 비동기적으로 메모리를 해제합니다.
  • 목적: 테스트가 끝난 후 데이터 정리를 위해서 사용하며, 실제 애플리케이션에서는 오래된 데이터나 불필요한 데이터를 삭제할 때 사용됩니다.

요약

  • geoadd: 경도와 위도를 기준으로 장소를 저장.
  • geodist: 두 장소 사이의 거리를 계산.
  • geosearch: 특정 좌표에서 일정 반경 내에 있는 장소를 검색.
  • geosearch with coordinates: 검색된 장소와 함께 좌표 정보를 반환.
  • unlink: Redis에서 특정 키를 삭제.

이 코드는 Redis의 GEO 기능을 사용하여 지리적인 데이터(위도/경도)를 저장하고, 두 지점 사이의 거리 계산, 특정 좌표 주변의 장소 검색 등을 구현하는 방법을 보여줍니다. 지도 기반의 서비스나 위치 기반 기능을 구축할 때 유용하게 사용할 수 있습니다.

저작자표시 (새창열림)

'DB > Redis' 카테고리의 다른 글

Redis 트랜잭션: 안전한 데이터 변경 처리하기  (0) 2024.09.11
Redis Bitmap 실습: 비트 단위 데이터 처리  (0) 2024.09.11
Redis Sorted Set 실습: 정렬된 데이터를 효율적으로 처리하기  (0) 2024.09.11
Redis Hash 실습: 키-필드-값 데이터 구조 관리하기  (2) 2024.09.11
Redis Set 실습: 집합 연산과 활용법  (0) 2024.09.11
'DB/Redis' 카테고리의 다른 글
  • Redis 트랜잭션: 안전한 데이터 변경 처리하기
  • Redis Bitmap 실습: 비트 단위 데이터 처리
  • Redis Sorted Set 실습: 정렬된 데이터를 효율적으로 처리하기
  • Redis Hash 실습: 키-필드-값 데이터 구조 관리하기
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (286)
      • 여러가지 (107)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (5)
        • 암호화폐 (5)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ecs
    파이썬
    Spring WebFlux
    프로그래머스
    Docker-compose
    reactor
    백준
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    mybatis
    SAA
    그리디
    자바
    Python
    spring
    FastAPI
    완전탐색
    WebFlux
    EC2
    DP
    RDS
    java
    OOP
    시험
    Spring Boot
    항해99
    celery
    Redis
    AWS
    취업리부트
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
Redis Geospatial 실습: 좌표 기반 데이터 처리
상단으로

티스토리툴바