전체 Redis Keys 구조
// Battle 관련
battle:{battleId} // Battle 정보
battle:room:{roomId} // roomId -> battleId 매핑
// Room 관련
room:{roomId}:info // Room 정보
room:list // 전체 Room 목록
room:{roomId}:players // 특정 Room 참가자 (Set)
room:{roomId}:spectators // 특정 Room 관전자 (Set)
// 추후 업데이트...
저장 예시
Battle 정보 저장
- key:
battle:{battleId}
- value:
Battle 객체
Key: "battle:22"
Value: {
"battleId": "22",
"roomId": "room123",
"status": "running",
"config": { "duration": 1800 },
"startedAt": "2024-01-15T10:30:00.000Z",
"users": [
{
"userId": "user1",
"code": "function solution() {...}",
"language": "javascript",
"progress": { "passedCount": 3, "totalCount": 10 },
"isConnected": true,
"isFinished": false
},
{
"userId": "user2",
"code": "const solution = () => {...}",
"language": "javascript",
"progress": { "passedCount": 5, "totalCount": 10 },
"isConnected": true,
"isFinished": false
}
]
}
Room ↔ battle 매핑
- key:
battle:room:{roomId}
- value:
battleId
- RoomId로 빠르게 BattleId를 찾기 위함
- 이게 없다면? → WebSocket 이벤트가 roomId 기준으로 올텐데, 해당하는 battle을 찾으려면 전체 battle을 조회해야 한다.