본문 바로가기
Backend

Redis(valkey)에 직접 커맨드를 추가해보자.

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

Redis(Remote Dictionary Server)는 In memory Key-Value NoSQL 로 다양한 자료구조를 제공하는것이 특징입니다.

이번 포스팅에서는 Redis에 새로운 명령어를 추가하는 과정을 수행하며 Redis 서버에 새로운 명령어를 등록하는 과정을 이해해보겠습니다.

 

목표

echo 명령어처럼 문자열을 그대로 반환하는 echo_haward 명령어 추가

실습은 오픈소스 valkey 저장소를 clone해서 사용합니다.

Valkey란 무언인가?

이걸 알기 위해선 Redis의 오픈소스 라이선스에 대해서 알아야합니다.

최초의 Redis의 라이센스는 BSDv3 라이센스 였습니다.

이 라이센스는 수정하면 수정했다고 명시만 해두면 어떻게 사용하더라도 문제가 없는 라이선스여서 많은 사람들이 Redis를 사용하게 됐습니다.

그런데 2024년 3월부터 Redis에서 Redis 에 RSAL + SSPL 라이센스를 적용하였습니다.

이 라이센스의 특징은 클라우드에서 사용 불가 + 서버 코드 전체 공개 안 하면 사용 불가라는 것이었습니다.

따라서 2024년 3월 Redis 7.2.4부터 Valkey 로 Fork 되었고 지금까지 다른 갈래로 흘러가고 있습니다.

2025년 4월부터 (Redis 8부터)Redis가 현재는 다시 라이센스를 AGPLv3로 바뀌어서 오픈소스가 되긴했지만 (SSPL은 오픈소스가 아님) 만약 Redis를 수정해서 쓰면 서버 코드 전부 다 공개 해야한다는 제약이 있어서 현재도 valkey와 Redis로 나뉘어있습니다.

 

GitHub - redis/redis: For developers, who are building real-time data-driven applications, Redis is the preferred, fastest, and

For developers, who are building real-time data-driven applications, Redis is the preferred, fastest, and most feature-rich cache, data structure server, and document and vector query engine. - red...

github.com

 

 

GitHub - valkey-io/valkey: A flexible distributed key-value database that is optimized for caching and other realtime workloads.

A flexible distributed key-value database that is optimized for caching and other realtime workloads. - valkey-io/valkey

github.com

 

두개의 레포지토리가 있고 저희는 valkey를 클론해서 사용합니다.

주요 파일 설명

  • server.c: Redis(Valkey)의 핵심 기능이 구현된 메인 소스 파일입니다.
    • Valkey 서버가 실행될 때 진입하는 파일입니다.
    • 이 안에서 initServer() 함수를 통해 서버 초기화가 이루어집니다.
    • 대부분의 명령어 처리 함수들이 이곳에 정의되어 있습니다.
    • 그 과정 중 populateCommandTable()이 호출되어 command.def에 정의된 명령어들이 실제 메모리에 등록됩니다.
  • server.h: server.c 함수의 헤더 파일입니다.
  • commands.def: 이 파일은 명령어 정의 파일로 명령어 테이블이라고 부릅니다.
    • 일종의 템플릿 데이터처럼 표현됩니다.
    • 빌드 과정 중 이 파일이 자동으로 파싱 돼 commands.c 파일이 생성 됩니다.
    • 따라서 추가하고 싶은 명령어는 이 목록에 등록해야합니다.

1 단계: 명령어 함수 추가 (server.c)

echoCommand와 동일하게 동작하는 echoHaward 함수를 작성합니다.

  • client *c 는 클라이언트 요청 정보를 담고 있습니다.
  • addReplyBulk() 함수로 문자열 그대로 응답합니다.

 

2 단계 함수 선언 추가(server.h)

다음으로 헤더파일인 server.h에 함수 원형을 추가해줍니다.

3단계 명령어 등록 (commands.def)

command.def로 생성된 command.c 파일 내부을 확인해보면 command.c 파일을 보면 첫 번째 인자가 name이며, 중간에는 인자는 function 명임을 볼 수가 있습니다.

command.c
commad.def

다음과 같이 command table이 있습니다.

명령어를 시스템에 등록하기 위해 commands.def 파일에 다음을 추가해줍니다.

여러 위치가 있는데 찾기 쉽게 echo 밑에 해줬습니다.

{MAKE_CMD("echo_haward",
  "Returns the given string.",
  "O(1)",
  "1.0.0",
  CMD_DOC_NONE,
  NULL,
  NULL,
  "connection",
  COMMAND_GROUP_CONNECTION,
  ECHO_History,
  0,
  ECHO_Tips,
  0,
  echoHaward,
  2,
  CMD_LOADING|CMD_STALE|CMD_FAST,
  ACL_CATEGORY_CONNECTION,
  ECHO_Keyspecs,
  0,
  NULL,
  1
), .args=ECHO_Args},

4 단계 valkey build

make clean && make

5단계 명령어 테스트

이제 redis 서버를 실행하고 redis-cli로 접속해서 명령을 실행하면 됩니다.

 

오늘은 Redis의 내부 동작을 이해하며 실제 명령어 추가는 어떻게 구성되었는지 확인할 수 있는 시간이었습니다.

오픈소스라서 옛날에는 막연하게 어렵게 다가왔는데 실제로 추가해보니까 생각보다 쉽게 구성되어있다는 점이 오픈소스에 대한 두려움을 줄여줄 수 있는 시간이었습니다.

728x90