728x90
북마커가 Valkey(기존 Redis) 데이터베이스에 저장되어 있다면,
다음과 같은 방식으로 사용자 위치와 비교하여 반경 5m 이내의 북마커를 찾을 수 있습니다.
📌 구현 개요
- Valkey에 북마커 좌표 저장 → GEOADD를 사용하여 좌표를 등록
- 반경 5m 이내 북마커 조회 → GEORADIUSBYMEMBER 또는 GEORADIUS 사용
📌 Valkey에 북마커 등록 (GEOADD 사용)
import { Injectable } from '@nestjs/common';
import { createClient } from 'redis';
@Injectable()
export class LocationService {
private client;
private readonly KEY = 'bookmarks'; // Valkey 키 이름
constructor() {
this.client = createClient({ url: 'redis://localhost:6379' });
this.client.connect();
}
/**
* Valkey에 북마커 추가
* @param id 북마커 ID
* @param latitude 위도
* @param longitude 경도
*/
async addBookmark(id: number, latitude: number, longitude: number) {
await this.client.geoAdd(this.KEY, {
longitude,
latitude,
member: id.toString(),
});
}
}
➡️ GEOADD 명령어를 사용하여 북마커(100개 이상)를 Valkey에 저장합니다.
📌 반경 5m 이내의 북마커 검색 (GEORADIUS 사용)
/**
* 사용자 위치 기준 반경 5m 이내의 북마커 조회
* @param userLatitude 사용자 위도
* @param userLongitude 사용자 경도
* @returns 5m 이내 북마커 ID 배열
*/
async getNearbyBookmarks(userLatitude: number, userLongitude: number): Promise<string[]> {
const nearbyBookmarks = await this.client.sendCommand([
'GEORADIUS',
this.KEY,
userLongitude.toString(),
userLatitude.toString(),
'5', // 반경 5m
'm', // 단위: 미터
]);
return nearbyBookmarks;
}
➡️ GEORADIUS 명령어를 사용하여 반경 5m 이내의 북마커 ID 리스트를 가져옵니다.
📌 사용 예시
const locationService = new LocationService();
// Valkey에 북마커 추가 (예제)
await locationService.addBookmark(1, 37.5665, 126.9780);
await locationService.addBookmark(2, 37.5666, 126.9781);
// 반경 5m 이내 북마커 검색
const nearby = await locationService.getNearbyBookmarks(37.5665, 126.9780);
console.log('5m 이내 북마커:', nearby);
📌 Valkey를 사용한 이유
✔ 속도 최적화 → Valkey는 인메모리 DB이므로 빠른 검색 가능
✔ 대량 데이터 처리 → 100개 이상의 북마커 처리 가능
✔ 간편한 거리 계산 → GEORADIUS 명령어로 간단하게 반경 검색
이제 Valkey를 활용해 빠르게 반경 5m 이내 북마커를 찾을 수 있습니다! 🚀
'게임서버-스파르타코딩NodeJs_7기 > CH6 최종 프로젝트' 카테고리의 다른 글
GEO 발키 사용 (0) | 2025.03.04 |
---|---|
기존 좌표 데이터 geo발키로 수정 (0) | 2025.03.03 |
MVP 중간발표 회고록 (0) | 2025.03.03 |
흥미유발 요소 추가하기 (0) | 2025.03.03 |
업적관련 test 코드 작성 중 오류 리포트 (0) | 2025.03.03 |