본문 바로가기
Backend

Redis에 나만의 명령어를 추가해보자.

by 뜨거운 개발자 2025. 5. 24.
728x90

이전 게시물에서는 Redis에 받은 내용을 그대로 다시 돌려주는 echo 명령을 만들어봤다.

이번 게시물에서는 redis-cli에 echo_prefix_haward abc 라고 보내면 응답이 abc 가 아니라 haward_abc 로 응답이 오도록 만드는 것입니다.

목표

> echo_prefix_haward abc 
hawardabc

1. 커맨드 함수 구현(server.c)

Redis에서는 문자열을 처리할 때 SDS(Simple Dynamic String) 이라는 Redis 전용 문자열 구조체를 사용합니다. SDS 구조체를 조작해서 prefix가 붙은 문자열을 만들어 볼 수 있습니다.

이전에 봤던 것 처럼 server.c에 구현해줍니다.

 

void echoPrefixHaward(client *c){
	sds s = sdscatfmt(sdsempty(), "haward%s", c->argv[1]->ptr);
	addReplyBulkSds(c,s);
}

 

  • sds : Redis에서 사용하는 안전한 문자열입니다.
    • 기존 C언어의 char * 문자열보다 동적 확장이 가능하고 안전성을 높였습니다.
  • sdsempty(): 빈 문자열을 생성합니다. NULL이 아닌 sds 객체로 초기화됩니다.
  • sdscatfmt(): Redis 내부에서 최적화된 printf()입니다.
  • *addReplyBulkSds(client c, sds s) : 클라이언트에게 응답을 SDS 형태로 전송합니다. 이 함수 내부에서 sdsfree()까지 수행하기 떄문에 따로 free 할 필요는 없습니다.

그외 주요 함수를 간단히 소개하자면

여기서 redisObject가 나오는데 레디스는 redisObject라는 구조체로 데이터를 표현합니다. (Valkey에선 serverObject

[redis 소스코드 server.h 참고]

serverObject에는 type, encoding 등 데이터에 대한 정보가 저장되고

실제 데이터는 void *ptr 위치에 존재합니다.

 

sds에 대한 더 많은 정보는 아래 링크를 참고하시길 바랍니다.

https://redisgate.kr/redis/configuration/internal_string.php

https://github.com/antirez/sds

https://redis.io/docs/latest/operate/oss_and_stack/reference/internals/internals-sds/ 

 

 

2. 빌드 및 실행

 

이제 이전 게시물과 똑같이 선언 추가, command.def 등록 후 빌드 해주면 됩니다.

무슨말인지 모르겠다면 이 게시물을 참고하시길.

https://haward.tistory.com/264

짜잔 다음과 같이 명령어가 생겼습니다.

느낀점

오픈소스 어렵게 생각했는데 생각보다 쉬운 것 같다는 생각이 드네요

언어에 대한 이해만 있고 공식문서를 차근차근 따라가다보면 그렇게 어려울 것 없이 사용할 수 있을 것 같고 왜 오픈소스에 기여하라는지도 알겠습니다. 기여를 하려면 어떤 기능이 어떻게 구현 되어있는지에 대한 이해가 필요하기 때문인 것 같네요.

Redis를 시작해서 다른 오픈소스에도 관심을 가져봐야겠습니다.

728x90