질문)
특정종목의 호가를 읽어올때는, 종목의 호가를 어떻게 redis에 쓰는게 가장 효과적일까요?
답변)
Redis를 **“실시간 주식 호가 시스템”**의 캐시 또는 저장소로 사용할 때,
특정 종목의 호가 정보를 어떻게 구조화할지는 다음과 같은 기준에 따라 결정됩니다:
✅ 설계 시 고려사항
실시간 업데이트 속도 | Redis는 메모리 DB이므로 빠른 쓰기/읽기를 극대화해야 합니다. |
데이터 양과 만료 전략 | 수천 종목 × 수십 호가 × 분당 수회 업데이트가 누적되므로, 만료(TTL)나 정리 필요 |
조회 패턴 | “최근 1건”, “N초 간 호가 변화”, “특정 시간대의 호가” 등 조회 방식에 따라 구조가 달라집니다. |
단일 조회 vs 연속 조회 | GET(단일 키 조회)과 ZRANGE, LRANGE(연속 조회) 등 Redis 명령 특성을 활용해야 합니다. |
🧩 Redis 구조 설계 예시
아래는 실무에서 자주 사용되는 구조입니다.
✅ (1) 최신 1건만 저장: String 타입
Key 예시:
Value:
바이너리 구조체 / JSON 문자열 / CSV 등
Set 명령 (C 구조체 직접 저장):
특징:
- 최신 1건만 유지
- GET만으로 간단하게 조회 가능
- 만료 설정 가능 (EXPIRE 또는 SETEX)
추천 용도: 실시간 화면에서 “현재가”, “현재 호가”만 빠르게 보여줄 때
✅ (2) 최근 N건을 저장: List 타입
Key 예시:
쓰기 (왼쪽에 넣기):
// 최근 100개만 유지
읽기:
특징:
- FIFO 구조
- 최근 N개를 효율적으로 조회 가능
- 정렬 필요 없음 (시간순)
추천 용도: “최근 호가 변화 내역” 조회 (5초 간격 등)
✅ (3) 시간 기준 정렬 저장: Sorted Set 타입
Key 예시:
쓰기 (timestamp를 score로):
읽기 (범위 조회):
특징:
- 시간 기반 정렬
- 특정 시간 범위 조회 가능
- 오래된 데이터 삭제 용이 (ZREMRANGEBYSCORE)
추천 용도: 과거 10초/1분 단위 호가 변화 분석, 거래소 수신 이력 로그
✅ (4) 한 종목에 다양한 필드를 넣고 싶다면: Hash 타입
Key:
필드: "ask1", "bid1", "ask2", ..., "volume", "time" 등
특징:
- 사람이 보기 쉽고 디버깅 쉬움
- 필드 단위 접근 가능
- 구조가 유연
추천 용도: 웹서버, 모니터링 시스템과 연동할 때 직관적 처리에 유리
🔍 실무 추천 조합
실시간 화면 조회 | String + Hash | GET HOGA:CUR:A005930, HGET HOGA:HASH:A005930 bid1 |
최근 내역 보기 | List | LRANGE HOGA:LIST:A005930 0 9 |
과거 분석 / 시간 기반 조회 | Sorted Set | ZREVRANGEBYSCORE HOGA:ZSET:A005930 ... |
대용량/백업 | ZADD + GET + 주기적 백업 | 바이너리 구조체 append 및 정기 삭제 |
📌 정리
종목 호가를 어떻게 Redis에 저장할까? | 가장 단순히는 String으로 현재 호가 1건 저장. |
N건 유지? | List로 LPUSH + LTRIM 또는 Sorted Set으로 ZADD. |
시간 기반 분석? | ZSET의 score를 timestamp로 사용해서 ZRANGEBYSCORE 조회 |
복잡한 필드 구조? | Hash로 key-field-value 조합으로 구성 |
참고)
#pragma pack(push,1) // 패딩 제거 (정확한 byte 수 보장) typedef struct { struct { uint8_t hh; uint8_t mm; uint8_t ss; uint16_t ms; // 0~999 } time; // 1 + 1 + 1 + 2 = 5 bytes int32_t yesga; // 예상 체결가 int32_t yevol; // 예상 체결량 int32_t yvolcha; // 예상 체결량 증감 int32_t zdiff; // 전일 대비 int32_t zgiho; // 대비 부호 (예: +1, -1) int32_t ydiff; // 직전 대비 char ydir; // 방향 ('+', '-', '=') // 호가 1~5단 + 잔량 int32_t ask_price[5]; // 매도호가 int32_t ask_volume[5]; // 매도 잔량 int32_t bid_price[5]; // 매수호가 int32_t bid_volume[5]; // 매수 잔량 } HOGA; #pragma pack(pop) |
'REDIS' 카테고리의 다른 글
Redis 는 “메모리 DB”이지만 디스크에 파일로 남길 수 있어요(백업용도) (0) | 2025.07.16 |
---|---|
TCP/IP수신 - REDIS수신 시간비교 (0) | 2025.07.09 |
작업을 순차적으로 처리하는 큐가 필요할 때(데이타원본대로) (0) | 2025.03.21 |
ServiceStack Version별 처리방법(Trial경우) (0) | 2025.01.21 |
Redis는 문자열 기반 저장소이기 때문에, byte[] 데이터를 저장하려면 적절히 직렬화(serialize)하거나 Base64 인코딩을 적용해야 합니다. (0) | 2025.01.16 |