찾다

 >  Q&A  >  본문

数据结构 - 关于 Redis 字符串小于 39 字节的疑惑

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 编码的缘由是什么?

PHP中文网PHP中文网2800일 전747

모든 응답(1)나는 대답할 것이다

  • ringa_lee

    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입니다. 으아악

    Redis는 2.4 버전부터 jemalloc 메모리 할당자를 사용하기 시작합니다. 이는 glibc의 malloc보다 훨씬 낫고 메모리를 절약합니다. 여기서 jemalloc은 8, 16, 32, 64바이트의 메모리를 할당한다는 것을 간단히 이해할 수 있습니다. 최소 embstr은 16+8+8+1=33이므로 최소 할당은 64바이트입니다. 문자 수가 39자 미만인 경우 64바이트가 할당됩니다.

    기본값 39는 이렇게 나온 것입니다.

    회신하다
    0
  • 취소회신하다