[입 개발] Redis 의 아이템의 크기 제한은 512MB입니다.

오늘 아시는 분께 Redis의 아이템의 크기 제한은 얼마인가요? 라는 질문을 받았습니다. 예전에 들었던 기억이 있었는데, 이게 아이템의 제한인지 key의 제한인지가 긴가민가 하더군요.

 

결론부터 말하면 일단 Redis 하나의 아이템의 최대 Value 크기는(Key 도) 512MB 입니다. 즉 이론적으로는 512MB 키에 512MB 데이터를 만들 수 있습니다.  memcached 가 내부 청크의 크기가 최대 아이템 크기였던것에 비하면 꽤 큰 편입니다.(Memcached의 기본 청크는 1MB 입니다.)

 

확인을 위해서 처음 찾았던 함수는 t_string.c의 checkStringLength() 라는 함수입니다.


static int checkStringLength(redisClient *c, long long size) {
if (size > 512*1024*1024) {
addReplyError(c,"string exceeds maximum allowed size (512MB)");
return REDIS_ERR;
}
return REDIS_OK;
}

 

그런데 이 checkStringLength() 함수를 setrangeCommand 와 appendCommand에서만 쓰고 정작 setCommand에서는 안쓰고 있는 것이었습니다. 그래서 순간, 어 관련 코드가 사라졌나 싶었는데, 실제 제약은 이 전에 packet 파싱할 때 존재합니다.

 

Redis 는 두 가지 형태로 커맨드를 받을 수 있는 데, 한줄에 모든 데이터가 있는 inline 형식과 실제 Redis에서 많이 사용하는 Multiline 형태가 있습니다. 이 때 inline 형태는 64kb가 한계이고, Multiline의 경우 파라미터당 512MB가 한계입니다. networking.c 에서 해당 코드를 찾을 수 있습니다.

 


ok = string2ll(c->querybuf+pos+1,newline-(c->querybuf+pos+1),&ll);
if (!ok || ll > 512 *1024*1024) {
addReplyError(c,"Protocol error: invalid bulk length");
setProtocolError(c,pos);
return REDIS_ERR;
}