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 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의 내부 동작을 이해하며 실제 명령어 추가는 어떻게 구성되었는지 확인할 수 있는 시간이었습니다.
오픈소스라서 옛날에는 막연하게 어렵게 다가왔는데 실제로 추가해보니까 생각보다 쉽게 구성되어있다는 점이 오픈소스에 대한 두려움을 줄여줄 수 있는 시간이었습니다.
'Backend' 카테고리의 다른 글
Aws Ec2에 무료로 spring 서버 올리기 (5) | 2024.10.10 |
---|---|
Aws SQS Spring 스캐줄러를 사용한 Listener 관리하기 (1) | 2024.10.06 |
[spring swagger로 에러문서화하기] 에러를 문서로 만들기 (2/2) (2) | 2024.09.28 |
[spring swagger로 에러문서화하기] 에러 형식 정의 및 handler 정의 (1/2) (0) | 2024.09.21 |
[k8s] kubectl 명령어가 동작하지 않을 때 (왜 쿠버네티스는 스왑 메모리 사용을 허용하지 않는가?) (1) | 2024.09.17 |