REDIS_ENCODING_EMBSTR_SIZE_LIMIT set to 39.
比如:
redis 127.0.0.1:2050> set massage "hello_world"
OK
redis 127.0.0.1:2050> object encoding massage
"raw"
为什么这段字符串小于 39 编码却是 raw?另外,小于 39 字节 embstr 编码,大于 39 raw 编码的缘由是什么?
ringa_lee2017-04-22 08:58:25
redis 버전과 관련된 내용입니다.
redis-3.0과 최신 버전의 object.c 파일을 보면 StringObject 생성 시 REIDS_ENCODING_EMBSTR_SIZE_LIMIT와 비교되는 것을 알 수 있습니다. 기본값은 39입니다.
redis-2.8 버전의 소스코드를 찾아보니 비교가 안되고 직접 만들어봤습니다.
그래서 이 embstr 인코딩은 버전 3.0 이상에서만 나타난 것 같습니다.
왜 39인지는 설명하기가 더 복잡해서 천천히 설명하겠습니다.
embstr은 redisObject와 sdshdr로 구성된 연속 메모리 영역입니다. 그 중 redisObject는 16바이트를 차지합니다. buf의 문자열 길이가 39일 때 sdshdr의 크기는 8+39+1=48입니다.
으아악
기본값 39는 이렇게 나온 것입니다.