|
| 1 | +# redis 라이브러리 사용 방법 정리 |
| 2 | + |
| 3 | +# C++ |
| 4 | +`cpp` 디렉토리에 정리 되어 있다. |
| 5 | + |
| 6 | + |
| 7 | +<br> |
| 8 | + |
| 9 | +# C# |
| 10 | +`csharp` 디렉토리에 정리 되어 있다. |
| 11 | + |
| 12 | +- `CloudStructures` 라이브러리 사용 방법 |
| 13 | + |
| 14 | + |
| 15 | +<br> |
| 16 | + |
| 17 | +# Golang |
| 18 | +`golang` 디렉토리에 정리 되어 있다. |
| 19 | + |
| 20 | +- `go-redis` 라이브러리 사용 방법 |
| 21 | + |
| 22 | + |
| 23 | +<br> |
| 24 | +<br> |
| 25 | + |
| 26 | + |
| 27 | +# 학습을 위해 실습하기 |
| 28 | +레디스 프로그래밍을 학습하기 위해 제시한 과제에 맞게 구현해야 한다. |
| 29 | + |
| 30 | +## 각 언어별 사용 라이브러리 |
| 31 | +- C#: CloudStructures |
| 32 | +- Golang: go-redis |
| 33 | +- C++: 레디스 공식 사이트 |
| 34 | + |
| 35 | + |
| 36 | +## 구현 조건 |
| 37 | +- 사례 별 요청과 응답을 편리하게 조작하기 위해 API 서버 기반에서 구현한다. |
| 38 | +- DB(MySQL 같은)는 사용하지 않고, 오직 Redis만 사용하거나 더미 데이터를 사용한다. |
| 39 | +- Redis는 1대만 사용한다고 가정한다. |
| 40 | +- Redis의 영구 저장 기능은 사용하지 않는다. |
| 41 | +- Redis는 서비스 중 절대 죽지 않는다고 가정한다. |
| 42 | +- 웹소켓은 사용하지 않는다. 오직 HTTP만 사용한다. |
| 43 | +- Redis 버전은 6.0 이상을 사용한다. 단 기본 기능만을 사용할 때는 Windows에 설치하기 위해 3.0 버전을 사용해도 된다. |
| 44 | + |
| 45 | + |
| 46 | +## 과제 |
| 47 | + |
| 48 | +### 로그인 |
| 49 | +저장할 것: 인증키, 앱버전, 데이터버전 |
| 50 | +``` |
| 51 | +public class PkLoginReq |
| 52 | +{ |
| 53 | + public string ID { get; set; } |
| 54 | + public string Password { get; set; } |
| 55 | +
|
| 56 | + public int AppVersion { get; set; } |
| 57 | + public int DataVersion { get; set; } |
| 58 | +} |
| 59 | +
|
| 60 | +public class PkLoginRes |
| 61 | +{ |
| 62 | + public int Result { get; set; } = 0; // 0 성공, 0 이외는 모두 실패 |
| 63 | + public string AuthKey { get; set; } |
| 64 | +} |
| 65 | +``` |
| 66 | + |
| 67 | +### 로그인 때 저장한 유저 정보 가져오기 |
| 68 | +사전에 유저의 게임 데이터를 Redis에 넣어 놓는다. |
| 69 | +로그인 때 넣으면 좋을 듯 |
| 70 | +예) api url: RequestLoadUserGameData |
| 71 | +``` |
| 72 | +public class PkLoadUserGameDatsReq |
| 73 | +{ |
| 74 | + public string ID { get; set; } |
| 75 | +} |
| 76 | +
|
| 77 | +public class PkLoadUserGameDatsReq |
| 78 | +{ |
| 79 | + public int Result { get; set; } = 0; // 0 성공, 0 이외는 모두 실패 |
| 80 | + public int Level { get; set; } |
| 81 | + public int Exp { get; set; } |
| 82 | + public int Money { get; set; } |
| 83 | +} |
| 84 | +``` |
| 85 | + |
| 86 | + |
| 87 | +### 동일 유저 요청는 순차적으로 처리되도록 하기(Lock 걸기) |
| 88 | +- 유저가 동시에 요청하더라도 한번에 하나만 처리해야 한다. |
| 89 | +- 게임 서버가 요청을 받아서 처리하는 중에 또 요청이 오면 이 요청은 에러 처리가 되어야 한다. |
| 90 | +- 테스트를 위해 서버는 이 요청을 받으면 내부에서 Sleep을 10초 건다. |
| 91 | +- 요청을 처리 중 서버가 크래시 되더라도 게임서버가 재 시작되면 유저는 요청을 할 수 있어야 한다. |
| 92 | + |
| 93 | + |
| 94 | +### 방문자 수 기록하기 |
| 95 | +- 로그인을 기준으로 한다. 1일 1회의 로그인만 방문자 수로 집계한다. |
| 96 | + |
| 97 | + |
| 98 | +### 요청을 2분 단위로 3회만 가능하도록 제한걸기 |
| 99 | +- 게임 서버에 2분 동안 3회만 요청 가능하다 |
| 100 | +- 2분이 지나면 요청 가능 횟수는 다시 3회가 된다. |
| 101 | +- 요청과 응답 데이터는 자유롭게 만든다 |
| 102 | + |
| 103 | + |
| 104 | + |
| 105 | +### 하루에 한 번만 참여 가능한 이벤트 |
| 106 | +- 경험치 업 이벤트는 1일 1회만 참여가능 |
| 107 | +- 이력 측면에서 특정 유저가 특정 날짜에 이 이벤트를 참여 했는지 여부를 알 수 있어야 한다. |
| 108 | + |
| 109 | + |
| 110 | + |
| 111 | +### 인증 문자를 받고나서 다음 인증 문자를 받으려면 1분의 대기 시간을 주기 |
| 112 | + |
| 113 | + |
| 114 | +### 링크드 리스트 구현하기 |
| 115 | +- Redis만을 사용하여 유저ID를 데이터로 하는 링크드 리스트 구현하기 |
| 116 | +- 유저 추가, 삭제 |
| 117 | +- 순회: 유저 앞에 있는 유저, A 유저 뒤에 있는 유저 |
| 118 | + |
| 119 | + |
| 120 | + |
| 121 | +### 좋아요 |
| 122 | +- 유저를 상대로 좋아요 하기/취소하기 |
| 123 | +- 누가 좋아요를 했는지 확인하기 |
| 124 | +- 좋아요를 한 개수 조회하기 |
| 125 | + |
| 126 | + |
| 127 | + |
| 128 | +### 최근에 본 인앱 상품 목록 보여주기(최근 순서대로 3개) |
| 129 | + |
| 130 | + |
| 131 | + |
| 132 | +### 랭킹 구현 |
| 133 | +- 1~10등 |
| 134 | +- 자신의 등수 |
| 135 | +- 자신의 등수를 기준으로 상하 각각 2명씩 |
| 136 | +- 선택: 동접자 처리 |
| 137 | + |
| 138 | + |
| 139 | + |
| 140 | +### 배틀 |
| 141 | +- 클라이언트는 배틀 시작을 요청하고, 응답을 서버로부터 받아야 한다 |
| 142 | + - NPC 정보를 보낸다. NPC 코드, NPC 이름, NPC 보상 경험치 |
| 143 | + - 배틀 클리어 후 받는 보상 정보를 보낸다. |
| 144 | +- 클라이언트는 배틀 중 처치한 NPC 정보를 알려준다. |
| 145 | +- 클라이언트는 배틀가 완료되면 서버에 알린다. |
| 146 | +- 배틀 클리어 조건은 배틀 시작에서 받은 모든 NPC를 다 처치해야 한다. |
| 147 | +- 서버는 배틀가 완료되면 이 때 처치한 모든 NPC로 부터 얻을 수 있는 경험치와 보상을 계산해서 알려준다. |
| 148 | +- 배틀 정보는 삭제 되어야 한다. |
| 149 | + |
| 150 | + |
| 151 | + |
| 152 | +### 배틀 - 보스 레이드 |
| 153 | +- 특정 보스를 여러 유저가 동시에 같이 공격한다 |
| 154 | +- 유저는 최대 5명까지만 참여 가능하다 |
| 155 | +- 보스를 처리하면 보상을 받는다 |
| 156 | + - 보상은 공격에 가장 크게 기여를 한 유저 순서로 차등 지급한다 |
| 157 | + - 보상과 각 유저 별 공격 히스토리(어떤 공격, 데미지 수치)도 보여줘야 한다 |
| 158 | + |
| 159 | + |
| 160 | + |
| 161 | +### 채팅 |
| 162 | +- 웹서버만으로 채팅을 구현한다. 웹소켓은 사용하지 않는다 |
| 163 | +- 채팅은 로비 단위로 구분된다. 로비 번호는 1~ 100개. |
| 164 | + - 각 로비당 최대 인원은 100명까지 |
| 165 | +- 유저는 로그인 시에 자동으로 로비에 입장해야 한다. 즉 서버에서 자동으로 넣는다. |
| 166 | +- 유저는 로그인 이후 로비 번호를 선택해서 로비 입장을 요청할 수도 있다. |
| 167 | +- 채팅 창을 통해서 이전 채팅 히스토리를 볼 수 있어야 한다. 단 현재 채팅에서 50개까지만 가능하다. |
| 168 | + |
| 169 | + |
| 170 | +### Job Queue |
| 171 | +- 다른 프로세스로 실행 중인 worker에 작업 요청하기 |
| 172 | + |
| 173 | + |
| 174 | + |
| 175 | +### 선착순 쿠폰 발행하기 |
| 176 | +- 선착순 3명에게만 쿠폰을 발행한다 |
| 177 | + |
| 178 | + |
0 commit comments