-
Valkey 실행및 명령어 추가해보기기타/ValKey 2025. 5. 21. 22:23
이번 글을 통해 2025 OSSCA 3, 4주차 때 배운 Valkey를 직접 실행해보고 명령어를 추가해보는 실습과정을 정리해보려고 한다.
1. Valkey란?
valkey는 key/value 인메모리 데이터베이스로 redis를 fork한 오픈소스다.
Valkey
FAST. RELIABLE. OPEN SOURCE, FOREVER. Valkey is an open source (BSD) high-performance key/value datastore that supports a variety of workloads such as caching, message queues, and can act as a primary database. The project is backed by the Linux Foundation
valkey.io
2. Valkey 실행해보기
valkey는 C언어로 된 프로젝트로 Makefile에 정의된 명령어로 빌드할 수 있다.
먼저 make명령어를 빌드를 해준다.
마지막에 make test를 실행해보라는 문구가 있지만 test가 많은지 실행시간이 너무 길어서 스킵하는 것을 추천한다.
이제 빌드를 완료했으니 valkey서버를 실행해보면 되는데 README.origin.md에 실행방법이 설명되어있다.
To run Valkey with the default configuration, just type:
% cd src
% ./valkey-server위 명령어로 valkey server를 실행하면 기본적으로 6379 port에 연결을 시도하기 때문에 혹시라도 해당 port를 이미 사용 중이라면 아래 명령어로 다른 port에 연결되도록 하면 된다.
./valkey-server --port {PORT_NUMBER}
실행을 해보면 아래와 같이 valkey서버가 정상적으로 실행된 것을 볼 수 있다.
간단한 명령어를 실행해서 정상적으로 서버가 동작하는지 확인해보자.
해당 valkey서버에 명령어를 보내는 방법으로는 telnet 명령어를 사용하거나 valkey프로젝트에서 제공하는 valkey-cli를 사용해볼 수 있다.
valkey-cli를 사용해보면 아래와 같다.
3. Valkey에 명령어 추가해보기
다음으로 valkey에 명령어를 추가해보려고 한다.
valkey에는 echo라는 명령어가 정의되어있고 echo는 명령어를 입력 시에 1번째 인자를 그대로 출력해주는 역할을 한다.
실행해보면 아래와 같다.
이 echo명령어와 동일한 역할을 하는 명령어 이름만 다르게 만들어보려고 한다.
일단은 새로운 명령어를 추가하기 위해서는 commands.def파일을 수정해주어야한다.
commands.def파일은 valkey 서버의 모든 명령어에 대한 정의를 포함하는 파일이다.
해당 파일에서 echo명령어가 어떻게 정의되어있는지 보면 아래와 같다.
{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}
하나씩 보면 MAKE_CMD는 모든 명령어를 일관된 형식으로 정의할 수 있게 해주기 위해 정의된 명령어로 commands.c에 있다.
commands.c를 보면 MAKE_CMD가 가지는 인자가 어떤 것인지 변수명으로 어느정도 이해를 할 수 있고 여기서 중요하게 볼 것은 function인자에 들어간 echoCommand이다.
echo명령어를 입력하면 echoCommand 함수가 실행되는 것을 유추해볼 수 있고 echoCommand는 server.c에 아래와 같이 정의되어있다.
void echoCommand(client *c) { addReplyBulk(c, c->argv[1]); }
이제 echo라는 명령어가 valkey서버에서 어떻게 실행되는지를 알았으므로 새로운 명령어를 추가해보면 아래와 같다.
1. commands.def파일 수정
{MAKE_CMD("echo_min","Returns the given string.","O(1)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHO_History,0,ECHO_Tips,0,echoMinCommand,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION,ECHO_Keyspecs,0,NULL,1),.args=ECHO_Args}
2. echoRatelCommand함수 추가
- server.h 파일 수정
void echoMinCommand(client *c);
- server.c 파일 수정
void echoMinCommand(client *c) { addReplyBulk(c, c->argv[1]); }
이제 다시 빌드 후 추가한 새로운 명령어를 실행해보면 정상 동작하는 것을 볼 수 있다.
4. 마지막으로
마지막으로 이번 실습을 하면서 가장 시간낭비한 삽질을 정리해보려고 한다.
나는 이미 6379 port를 사용 중에 있어서 valkey서버를 띄울 때 다른 포트번호를 사용했다.
그리고 valkey-cli를 실행할 때는 따로 port번호를 정의하지 않고 ./valkey-cli 명령어를 사용했다.
이렇게 했을 때의 문제는 valkey서버는 6379포트에 연결되어있지 않는데 valkey-cli는 6379포트에 연결되어서 valkey-cli에 새로 추가한 명령어를 아무리 입력해도 모르는 명령어라고 결과가 나왔다.
valkey-cli를 실행할 때 에러가 발생했으면 빠르게 원인을 파악해볼 수 있었을텐데 6379포트에 도커로 띄운 레디스서버가 연결되어있어서 valkey-cli가 에러없이 실행됐고 valkey가 redis를 fork한 서버이다보니 기존 명령어도 정상적으로 실행되었다.
valkey서버를 다른 포트번호를 지정해서 실행했다면 valkey-cli도 아래 명령어로 같은 포트번호로 실행시켜줘야한다.
./valkey-cli -p {PORT_NUMBER}
'기타 > ValKey' 카테고리의 다른 글
Valkey 명령어 기능 추가해보기 (0) 2025.05.27