첨부된 이미지에서 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 실습: 키-필드-값 데이터 구조 관리하기 (0) | 2024.09.11 |
Redis Set 실습: 집합 연산과 활용법 (0) | 2024.09.11 |