요구사항
기존에 모든 서버에서 수집 로직을 실행할 때 수집 가능 여부를 특정 한 서버에서 DB를 직접조회하는 방식으로 데이터를 가져옴. 자주 변경되는 데이터가 아니니 매 번 API호출로 DB를 직접 조회하는 방식이 아닌 각 서버의 레디스DB에 캐싱하도록 저장해 그 정보를 가져올 수 있도록 구현
구현
현재 회사에는 글로벌 레디스와 로컬레디스 두 종류가 있음. 로컬레디스는 각 서버가 바라보는 레디스. 글로벌 레디스와 로컬레디스는 마스터-슬레이브 구조. 글로벌 레디스 데이터를 조정하면 모든 로컬레디스는 글로벌 레디스의 데이터를 바라보도록(싱크) 되어있음.
다른 구현 로직 참고 - 현재 조회 전 조회중단 여부(change scraping method의 값)은 아래 구조로 되어음.

동일하게 적용해 소스적용에는 문제가 없었지만 문제 상황이 발생
문제
기존에 해당 DB에 있는 모든 값을 한 HashKey로 저장을 해 특정 그룹(Field key)의 정보를 들고와야하는 상황에 Hscan을 사용하는 상황이 필요해짐. 레디스 명령어를 적용하는 코어단에서 에러가 나는 상황.
에러 이유는 다음과 같았다.
hscan을 사용할 때 hscan의 명령어 순서가 있는데 명령어 내부는 count를 기본 20.
그러므로 20개가 넘어갈 때는 for문을 돌면서 next cursor를 조정하는데
next cursor의 값과 key입력하는 위치가 달라 데이터를 불러오지 못함.
해당 부분을 해결했지만 코어 수정이므로 컨펌 후에 배포가 가능.
컨펌을 받으면서 Hscan의 사용 이유에 대해서 질문을 받았고
scan의 효율성을 문서로 확인해보고 정말 필요한 상황이 아니면 사용을 자제할 것이라는 답변을 받았다.
그래서 redis 공식 사이트에서 문서 확인. (https://redis.io/commands/scan/)
추가로 카카오테크의 문서 참고. (https://tech.kakao.com/2016/03/11/redis-scan/)
결국 hscan 사용시에는 굳이 한 블럭을 순회하는 상황이고 제가 저장한 키를 한 depth를 더 나누면 되는 상황인데 키를 하나만 사용해 불필요한 순회를 하면서 값을 가져오게 됐습니다.
해결
아래와 같이 키 저장 방식과 로직을 수정.
기존 예시
과일(hash key)
파란사과 - 구매가능 <= field key, value
초록사과 - 구매불가
빨간사과 - 구매불가
노란바나나 - 구매가능
초록바나나 - 구매가능
검정바나나 - 구매가능
위 데이터는 사과 그룹의 값만 가져오고 싶을때 hscan 과일 match *사과 방식을 사용해 불러와야했음
위 데이터를 아래와 같이 변경
사과(hash key)
파란사과 - 구매가능
초록사과 - 구매불가
빨간사과 - 구매불가
바나나(hash key)
노란바나나 - 구매가능
초록바나나 - 구매가능
검정바나나 - 구매가능
소스에서 레디스 명령어를 넣기 전에 그룹으로 분류할 수 있는 데이터 일부를 수정해 각 그룹에 알맞게 데이터가 들어가도록 변경 후 그룹을 hash key로 지정
로직은 위에 설명했듯이 맨 처음에는 데이터가 없으니 DB에서 조회.
DB 조회 결과값이 검정사과 - 구매불가 라면 검정사과에서 검정을 뺀 값을 키로 저장 후 hset
ex.) hset 사과 검정사과 구매불가
그룹을 나누는 기준은 그룹 별로 호출하는 로직들이 있었는데 해당 로직을 기준으로 테이블 확인 후 그룹 구분
이후 hgetall 사과 로 hscan을 따로 사용할 필요 없이 구현 완료
위 업무로 얻게 된 것들
1. 레디스 관련 개념 파악 및 구현
2. 레디스DB 접속 및 확인
3. scan 함수 효율성
'회사' 카테고리의 다른 글
네이버 커머스 API 요청량 제한에 따른 카프카 조정 (0) | 2024.04.22 |
---|---|
테스트 프로그램 구현 제안 회고 (0) | 2024.03.06 |
개발자도 말을 잘 해야 한다 (2) | 2024.02.15 |
타입스크립트에서 JAR, EXE 파일 실행 제안 (2) | 2024.02.14 |
회사 개발 문화를 제안해본 후기 (0) | 2024.02.13 |