회고

OSSCA - Git 활용 및 Redis 체험형 멘티 후기

soohey 2024. 7. 16. 16:59

대학 동기의 추천으로 오픈소스 아카데미의 존재를 알게 되었습니다.

백엔드 개발자로 일하면서 제일 친숙한 레디스에 흥미가 제일 갔습니다.

그래서 git 활용 및 Redis 섹션에 지원하게 되었습니다.

 

지원 동기는 직무 내용에 대해 작성했던 것 같습니다.

회원 로직 개발 내용과 함께 레디스 오픈소스에 대해 흥미가 생긴 배경에 대해

작성했습니다. 그와 더불어 자기소개도 작성해야했는데

저의 개발 성향과 최근에 했던 흥미로운 프로젝트들에 대해 작성했습니다.

 

OSSCA에는 체험형/참여형으로 나뉘는데 체험형의 경우 4주, 참여형의 경우 12주 정도로

기간차이가 납니다. 체험형을 통해 가볍게 오픈소스를 경험해볼 수 있었습니다.

 

4주간의 실습이 끝난 뒤에는 멘티별로 개별 활동서를 작성해야합니다.

1,2,3,4주차 동안 진행한 실습과 과제들이 있다면 정리해서 작성합니다.

 

1주차 실습

 

GitHub - suhyeon10/ossca-redis-2024: OSSCA 2024

OSSCA 2024. Contribute to suhyeon10/ossca-redis-2024 development by creating an account on GitHub.

github.com

 

 

Update README.md · charsyam/ossca-redis-2024@6658490

suhyeon10 committed Apr 13, 2024

github.com

 

2주차 실습

 

1) github 포크 후 자신의 정보 업데이트 후 PR 생성

  • 윈도우 환경이라 WSL로 실행
git clone <https://github.com/valkey-io/valkey> # 코드 내려받기

make # 빌드

./valkey-server # 폴더 이동

 

 

2) Redis key 조회

  • cli 실행
    • ./valkey-cli
  • key 저장
    • set redis valkey
    • get redis

3) RESP - Redis 의 Request/Response Format

  • Redis Serialization Protocol
  • 현재 RESP v2, v3 의 두 가지 버전이 있습니다.
  • 기본으로는 RESP v2를 사용하게 되고 hello 3 라는 명령을 사용하면 개별로 RESP v3를 사용하게 됩니다.

RESP v2

  • 각 라인은 \\r\\n 으로 구분type 시작 구분자 내용 
    type 시작 구분자 내용
    status + 특수문자가 없는 일반 스트링을 표현할 때 사용 +OK
    error - 특수문자가 없는 에러 문자열을 표현할 때 사용 -ERR
    integer : 정수를 표현한다. (float 표현은 되지 않는다) :1234
    bulk $ 특수문자가 포함된 문자열을 표시한다. $(사이즈)\r\n 실제문자열\r\n
    multibulk * 배열을 표시할 때 사용한다
    *1\r\n    
    $4\r\n    
    ping\r\n    

RESP v3

  • 개별 커넥션마다 업그레이드를 해야만 가능하다type 시작 구분자 내용 
    type 시작 구분자 내용
    Blob Error ! - 특수문자가 포함된 문자열로 에러 표시때 사용
    - $와 사용법은 동일
    !(size)\r\n
    ERR\r\n
    Big Number ( 큰 정수를 표현
    (1234567890\r\n
    Double . 실수 표시
    .3.14\r\n
    .inf
    .-inf
    NULL - null 표시
    Boolean # #t\r\n
    #f\r\n

과제 2) 다음 레디스 명령을 RESP v2 형식으로 변형하세요.

  • \r\n을 다 붙여주세요.
  • 과제 내용
    • hset hkey ossca 2024
    • ping
    • incr a
hset hkey ossca 2024
=>
+hset\\r\\n+hkey\\r\\n+ossca\\r\\n:2024\\r\\n
-----
ping
=>
+ping\\r\\n
-----
incr a
=> 
+incr\\r\\n+a\\r\\n

 

3주차 실습

과제) 레디스에 명령을 추가하세요.

  • 받은 내용을 그대로 다시 돌려주는 echo 명령을 만들어봅시다
  • src/ 디렉토리 밑에 commands 시작하는 다음과 같은 파일들이 있습니다.
    • src/commands.h
    • src/commands.c
    • src/commands.def
💡 Redis 에 echo{영어이름} command를 추가해보세요.
  • 영어이름은 영어대소문자와 숫자로만 만들어주시면 됩니다.
  • 실제 함수만 추가가 아니라, 함수 구현이 추가되어야 합니다.
    • 1차적으로는 echoCommand를 찾아서 함수명만 만들어주시면 됩니다.
  • branch를 만들고 PR로 보내주시면 됩니다.
  • hint
    • commands.def 에 추가할 함수를 echoCommand를 참고해서 추가하고,
    • server.c 에도 echoCommand를 참고해서 추가하면 됩니다.
  • 해당 과정도 블로깅 후에 링크를 과제방에 공유해주세요. 

 

깃허브 

echoSUHYEONCommand 추가 · charsyam/ossca-redis-2024@ab3e898

 

 

 

echoSUHYEONCommand 추가 · charsyam/ossca-redis-2024@ab3e898

suhyeon10 committed May 5, 2024

github.com

src/commands.def

#ifndef SKIP_CMD_HISTORY_TABLE
/* ECHO_SUHYEON history */
#define ECHO_SUHYEON_History NULL
#endif

#ifndef SKIP_CMD_TIPS_TABLE
/* ECHO_SUHYEON tips */
#define ECHO_SUHYEON_Tips NULL
#endif

#ifndef SKIP_CMD_KEY_SPECS_TABLE
/* ECHO_SUHYEON key specs */
#define ECHO_SUHYEON_Keyspecs NULL
#endif

/* ECHO_SUHYEON argument table */
struct COMMAND_ARG ECHO_SUHYEON_Args[] = {
{MAKE_ARG("message",ARG_TYPE_STRING,-1,NULL,NULL,NULL,CMD_ARG_NONE,0,NULL)},
};

..............
.....
...

{MAKE_CMD("echoSUHYEON","Returns the given string.","O(1)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHO_SUHYEON_History,0,ECHO_SUHYEON_Tips,0,echoSUHYEONCommand,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION,ECHO_SUHEYON_Keyspecs,0,NULL,1),.args=ECHO_SUHYEON_Args},

src/server.c

void echoSUHYEONCommand(client *c) {
    addReplyBulk(c,c->argv[1]);
}

src/server.h

void echoSUHYEONCommand(client *c);

 

4주차 실습

과제) 과제3을 개선해봅시다

  • 받은 내용을 그대로 다시 돌려주는 echo 명령을 만들어봅시다
  • echo2 abc 라고 보내면 응답이 abc 가 아니라 echo2_abc 등으로 응답이 오도록 만드는 것입니다.

응답예제

 

힌트

  • 기존에 사용하던 client *c 의 내부구조를 살펴보아야 합니다.

  • 다음 구조체와 함수들을 참고하세요.
    • sds
    • sdscatfmt
    • sdsempty
    • addReplyBulkSds
  • 과제 #2의 echo2 커맨드를 개선해서 앞에 echo2_ 가 붙도록 수정해보세요.

src/server.c

void echoSUHYEONCommand(client *c) {
    sds s = sdscatprintf(sdsempty(), "echo2_%S", c->argv[1]->ptr);
    addReplyBulkSds(c, s);
}
  • sdsempty() 함수를 사용하여 빈 SDS 생성
  • sdscatprintf() 함수를 사용하여 "echo2_" 문자열과 클라이언트가 보낸 메시지를 SDS에 추가
  • addReplyBulkSds() 함수를 사용하여 SDS를 클라이언트에게 응답으로 보냄

 

좋았던 점 💪

  • 레디스 내부 구조까지 뜯어본 적이 없는데 생소한 경험이었다. 간단한 명령어를 추가하는 실습으로 다음엔 더 재밌는 명령어를 추가해볼 수 있을 것 같다.

아쉬웠던 점 🥲

  • 다른 팀원들과의 교류를 열정적으로 참여하지 못한 것 같아 아쉽다

향후 ⭐

  • 배웠던 것들을 블로그에 업데이트하고 다른 소스들도 뜯어보고 해석해보고 싶다!