📌 개요
Hash 와 역인덱스는 30분 TTL 로 자동 정리되지만, Sorted Set 의 멤버는 키 단위 TTL 불가하여 orphan 으로 남는다. 명시적 delete() 호출 없이 사용자가 inactivity 로 떠난 경우 (브라우저 닫기, 30분 무동작 등) 발생한다.
이로 인해 findRank() 가 orphan 포함한 잘못된 순번을 반환하고, findAdmissionCandidates() 도 앞 batchSize 가 orphan 일 시 살아있는 토큰을 놓치는 문제가 있다.
🎯 목표
🧩 리팩토링 범위
🏗️ 변경 설계
변경 전 구조
- Hash, 역인덱스: TTL 자동 만료 ✅
- Sorted Set 멤버: TTL 불가 → orphan 잔재 ❌
- findRank, findAdmissionCandidates 가 orphan 영향 받음
변경 후 구조 — 해결 방안 후보
| 방식 |
장점 |
단점 |
| 스케줄러 정기 정리 |
구현 단순, 일괄 ZREM |
정리 주기 동안 orphan 잔류, 클러스터 환경 중복 실행 방지 필요 |
| Lua lazy cleanup |
조회 시점 즉시 정리, 별도 인프라 불필요 |
조회 지연 증가, findRank·findAdmissionCandidates 복잡도 상승 |
| Keyspace Notification |
만료 즉시 ZREM 가능 |
Redis 설정 변경(notify-keyspace-events) 필요, 알림 유실 가능(at-most-once) |
스케줄러 + Lua lazy cleanup 조합도 고려 가능 (스케줄러로 주기 정리, lazy cleanup으로 즉각 보정)
영향 받는 기능
findRank(): orphan 멤버를 포함한 잘못된 순번 반환
findAdmissionCandidates(): 앞 batchSize개가 orphan일 경우 살아있는 토큰 누락
- 신규 스케줄러 컴포넌트 추가 가능
⚠️ 주의 사항
- 기능 동작은 기존과 동일 (정확성만 ↑)
- API 스펙 변경 없음
- 클러스터 환경 도입 시 스케줄러 중복 실행 방지 (분산 락 또는 단일 인스턴스 지정)
🧪 검증 방법
- 기존 테스트 통과 여부 확인
- orphan 시나리오 통합 테스트 추가 (TTL 만료 후 findRank 검증)
- 정리 주기 후 Sorted Set 크기 검증
📌 개요
Hash 와 역인덱스는 30분 TTL 로 자동 정리되지만, Sorted Set 의 멤버는 키 단위 TTL 불가하여 orphan 으로 남는다. 명시적
delete()호출 없이 사용자가 inactivity 로 떠난 경우 (브라우저 닫기, 30분 무동작 등) 발생한다.이로 인해
findRank()가 orphan 포함한 잘못된 순번을 반환하고,findAdmissionCandidates()도 앞 batchSize 가 orphan 일 시 살아있는 토큰을 놓치는 문제가 있다.🎯 목표
🧩 리팩토링 범위
🏗️ 변경 설계
변경 전 구조
변경 후 구조 — 해결 방안 후보
findRank·findAdmissionCandidates복잡도 상승notify-keyspace-events) 필요, 알림 유실 가능(at-most-once)영향 받는 기능
findRank(): orphan 멤버를 포함한 잘못된 순번 반환findAdmissionCandidates(): 앞batchSize개가 orphan일 경우 살아있는 토큰 누락🧪 검증 방법