Database/Redis
[OSSCA2024] Redis 과제 3
[dev] hiro
2024. 4. 25. 21:23
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
과제 3
받은 내용을 그대로 다시 돌려주는 echo{영어이름} 명령을 만들어보자
과제 시작 전 배경지식..
Redis에 명령은 어디에 저장되어 있을까?
src/ 디렉토리 밑에 commands 시작하는 파일이 존재.
src/commands.h
src/commands.c
src/commands.def
추가: def 파일 정리
echo 명령은 어떻게 실행될까?
기본적으로 echo 명령은 받은 문자를 그대로 반환하는 명령이다.
과정
// commands.h
// commands.c
#define MAKE_CMD(name,summary,complexity,since,doc_flags,replaced,deprecated,group,group_enum,history,num_history,tips,num_tips,function,arity,flags,acl,key_specs,key_specs_num,get_keys,numargs) name,summary,complexity,since,doc_flags,replaced,deprecated,group_enum,history,num_history,tips,num_tips,function,arity,flags,acl,key_specs,key_specs_num,get_keys,numargs
#define MAKE_ARG(name,type,key_spec_index,token,summary,since,flags,numsubargs,deprecated_since) name,type,key_spec_index,token,summary,since,flags,deprecated_since,numsubargs
#define COMMAND_STRUCT redisCommand
#define COMMAND_ARG redisCommandArg
// commands.def
{MAKE_CMD("echo","Returns the given string.","O(1)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHO_History,0,ECHO_Tips,0,echoCommand,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION,ECHO_Keyspecs,0,NULL,1),.args=ECHO_Args},
// server.h
void echoCommand(client *c);
//server.c
void echoCommand(client *c) {
addReplyBulk(c,c->argv[1]);
}
- commands.h 파일에는 redis의 command에 대한 arg 타입들을 지정.
- commands.c 파일에는 함수타입을 지정.
- commands.def 파일에는 실제 함수를 지정하는 라인이 존재.
- echo 함수는 echoCommand를 실행.
- server.h 파일에는 echoCommand() 함수를 정의.
- server.c 파일에는 실제 echoCommand() 함수를 구현.
하는 프로세스로 동작을 하였다.
추가: 프로세스 정리
과제 수행
나의 이름과 좋아하는 숫자를 조합하여 echoHero17 명령어를 생성.
// commands.def
{MAKE_CMD("echoHERO17","Returns the given string.","O(1)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHO_History,0,ECHO_Tips,0,echoCommandHero17,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION,ECHO_Keyspecs,0,NULL,1),.args=ECHO_Args},
// server.h
void echoCommandHero17(client *c);
// server.c
void echoCommandHero17(client *c) {
addReplyBulk(c, c->argv[1]);
}
- commands.def 파일에는 echoHERO17 명령어를 생성하고 echoHERO17은 echoCommandHero17()를 실행.
- server.h 파일에는 echoCommandHero17() 함수를 정의.
- server.c 파일에는 실제 echoCommandHero17() 함수를 구현.
다음과 같이 echoHERO17 명령어가 잘 실행되는 것을 볼 수 있다.
느낀점
레디스의 코드를 볼 수 있어서 좋았지만 아직 모르는 코드와 실행동작이 존재하였다. 과제 이후에도 블로그를 지속적으로 수정하면서 포스팅을 보안해 나가야겠다.