robj 객체에 대해서 살펴보자. server.h 를 확인해보면 robj 는 serverObject 의 typedef 이다.
1
typedefstruct serverObject robj;
server.h의 serverObject 객체는 다음과 같다.
해당 구조체 정의 위의 매크로와 주석을 살펴보면 (server.h의 697 line~) 각 필드에 대응하는 값들이 어떤 역할을 하는지 알 수 있다.
type 필드는 해당 객체가 Redis의 어떤 데이터 타입인지(REDIS_STRING, REDIS_LIST, REDIS_HASH, REDIS_MODULE, REDIS_STREAM 등)를 나타내며, encoding 필드는 해당 객체가 메모리에서 어떤 방식으로 인코딩되어 있는지(OBJ_ENCODING_RAW, OBJ_ENCODING_INT, OBJ_ENCODING_EMBSTR 등)를 나타낸다. lru 필드는 객체에 대한 캐시 정책(LRU) 정보를, hasexpire 필드는 만료 시간을 가지고 있는지 여부를, refcount 필드는 참조 횟수를 나타냅니다.
정리하자면 robj (serverObject)는 Redis의 내부의 객체들을 추상화한 객체라고 요약할 수 있다.
echoPunchDrunkard_ 라는 접두사와 클라이언트가 보낸 인자(c→argv[1]) 를 결합하여 SDS 문자열을 생성한다.
1.에서 만든 SDS 문자열을 addReplyBulkSds 를 통해 클라이언트에게 보낸다.
위의 동작을 커스텀 명령어의 핸들러 함수인 echoCommandPunchDrunkard(client *c) 에 정의해주면 된다.
echoPunchdrunkard 를 정의할 때, 기존의 echo 명령어와 arity 를 똑같이 정의하였기 때문에 우리는 단순히 c->argv[1]->ptr 에 있는 SDS 문자열과 접두사 문자열을 결합한 후, 이를 그대로 클라이언트에게 addReplyBulkSds 를 이용해서 응답하면 된다.