유저 수도 많고, 북마커 수도 많다면 처음부터 최소한의 북마커만 가져오는 방식으로 설계해야 함.
현재 문제는 모든 데이터를 가져온 후 거리 필터링을 한다는 것인데, 이를 해결하기 위해 Redis에서 처음부터 거리 기반으로 필터링하는 방법을 적용할 수 있음.
해결 방법
- Redis에서 공간(Geo) 데이터를 활용
→ Redis의 GEO 기능을 사용하면 특정 반경 내의 데이터를 직접 가져올 수 있음.
→ GEOADD, GEORADIUS(또는 GEOSEARCH)를 사용하면 거리 계산 없이 바로 반경 내 데이터만 조회 가능. - 서버에서 필터링하는 방식과 비교
- 기존 방식:
모든 데이터를 가져온 후 거리 계산 후 필터링 → 연산량 증가 - 개선 방식:
Redis에서 5m 반경 내의 데이터만 조회 → 최소한의 데이터만 서버로 전송 → 처리 속도 향상
- 기존 방식:
Redis GEO를 활용한 개선 코드
1) Redis에 북마커 데이터를 GEO로 저장하기
서버에서 Redis에 데이터를 넣을 때 GEOADD 명령어를 사용하면 위치 데이터를 효율적으로 저장할 수 있음.
// 북마커 저장 (초기 데이터 세팅 시 필요)
await this.valkeyService.geoAdd(
'pinkmong-locations',
bookmark.longitude,
bookmark.latitude,
bookmark.id, // 고유한 ID
);
2) 유저 위치 기준으로 5m 반경 내 북마커 조회
이제 GEOSEARCH를 사용해서 5m 반경 내 북마커만 조회하면 됨.
이 방식은 모든 데이터를 불러오는 기존 방식보다 훨씬 빠름!
// 유저 위치 기준으로 5m 반경 내 북마커 가져오기
const nearestKeys = await this.valkeyService.geoSearch(
'pinkmong-locations',
user_direction.longitude,
user_direction.latitude,
5, // 5m 반경 내 검색
'm', // 단위: 미터(m)
1, // 가장 가까운 1개만 가져오기
);
if (!nearestKeys || nearestKeys.length === 0) {
throw new NotFoundException('주변에 북마커가 없습니다.');
}
// 가져온 키를 사용하여 데이터 조회
const nearestBookmarkP = await this.valkeyService.getString(nearestKeys[0]);
const parsedBookmark = JSON.parse(nearestBookmarkP);
console.log('🔍 가장 가까운 북마커:', parsedBookmark);
변경점 요약
✅ GEOADD를 사용해 Redis에 북마커 좌표 저장
✅ GEOSEARCH를 사용해 5m 이내 북마커만 조회 → 불필요한 데이터 조회 제거
✅ 서버에서 거리 계산 없이 즉시 필요한 데이터만 가져옴 → 부하 감소 & 속도 향상
기대 효과
💡 기존 방식 대비 훨씬 가벼운 연산
💡 유저 수가 많아도 성능 유지 가능
💡 불필요한 Redis 조회 및 JSON 파싱 최소화
이 방식으로 변경하면 수천~수만 명의 유저가 동시 접속해도 Redis에서 빠르게 검색 가능하므로,
현실적인 성능 문제를 해결할 수 있기를 기대.
https://valkey.io/commands/#geo
Valkey · Commands
List BLMOVE Pops an element from a list, pushes it to another list and returns it. Blocks until an element is available otherwise. Deletes the list if the last element was moved. BLMPOP Pops the first element from one of multiple lists. Blocks until an ele
valkey.io
'게임서버-스파르타코딩NodeJs_7기 > CH6 최종 프로젝트' 카테고리의 다른 글
업적관련 test 코드 작성 중 오류 리포트 (0) | 2025.03.03 |
---|---|
길찾기 지도 (0) | 2025.02.28 |
사용자와 북마커 계획 (0) | 2025.02.26 |
사용자위치와 다수의 북마커 관리 (0) | 2025.02.26 |
위치 기반 북마크 도착 이벤트 기능 구현 계획 (0) | 2025.02.26 |