📘스케줄러와 Redis 기반으로 한 특정 시간 알림 기능 - 저장 및 수정 기능


uniqueKey는 userId + meetingId 조합을 사용하여 유니크성 보장uniqueKey와 score(스케줄러 실행 시간, Instant 기반 Double 타입)를 저장score 순으로 정렬되어 조회 효율이 높음score 값은 스케줄러 기준 시간을 Instant로 설정한 뒤 Double 타입으로 변환하여 저장uniqueKey와 실제 알림 데이터 객체를 저장하며, 일반 Map 구조와 유사
객체 생성을 위한 별도 config 생성
//객체 전용 Template 별도 구현
private final RedisTemplate<String, MeetingReminderMessage> redisReminderTemplate;
ZSET
| Key | Member (uniqueKey) | Score (기준 시각, epoch milli) |
|---|---|---|
| reminder:meeting | 123:456 | 1733970000000 |
| reminder:meeting | 789:111 | 1733971800000 |
| reminder:meeting | 555:999 | 1733973300000 |
HASH
| Key | Field (uniqueKey) | Value (JSON 직렬화 예시) |
|---|---|---|
| reminder:meeting:data | 123:456 | {"userId":123,"meetingId":456,"title":"스터디"} |
| reminder:meeting:data | 789:111 | {"userId":789,"meetingId":111,"title":"회의"} |
| reminder:meeting:data | 555:999 | {"userId":555,"meetingId":999,"title":"점심"} |
rangeByScore 메서드를 사용해 특정 시간 범위에 해당하는 키 목록 조회Set<V> rangeByScore(K key, double min, double max, long offset, long count);
multiGet 메서드로 객체 리스트 조회List<HV> multiGet(H key, Collection<HK> hashKeys);
List<Object>를 알림용 DTO 리스트로 변환하여 반환| 방식 | 하루 | 매 시간 | 매 분 |
|---|---|---|---|
| 네트워크 총량 | 25.6MB/일 ($0.002) | 25.6MB/일 ($0.002) | 25.6MB/일 ($0.002) |
| 컴퓨팅 피크 | 1,666 rps ≈ 17 vCPU | 238 rps ≈ 3 vCPU | 4 rps ≈ 1 vCPU |
| 실패/재시도 리스크 | 높음 | 중간 | 낮음 |
| 예상 총비용 | $4.76/일 | $0.84/일 | $0.28/일 |
score 기준 30분 이내 범위의 uniqueKey 목록 조회. 한 번에 최대 1000건
reminder:meeting:{date}, Member에는 uniqueKey+alarmType 저장expire를 사용해 마킹 데이터는 2일 후 자동 삭제updateSentMessages 메서드에서 한 번에 처리uniqueKey 목록을 전달받아 처리remove로 삭제해 예약 인덱스 제거delete로 삭제해 상세 데이터 제거score 기준 2~8일 전 범위의 uniqueKey를 조회해 대상 선정maxCount 건만 처리해 Redis 부하를 최소화