1. 특수 인코딩:
Redis 2.2부터 특수 인코딩을 통해 많은 데이터 유형을 저장 공간에 최적화할 수 있습니다. 그 중 Integer로 구성된 Hash, List, Set 모두 이 방법을 사용하면 저장 구조를 최적화하여 어떤 경우에는 9/10의 공간을 절약할 수 있습니다.
이러한 특수 인코딩은 Redis 사용에 완전히 투명합니다. 실제로 이는 CPU와 메모리 간의 트랜잭션일 뿐입니다. 메모리 사용량이 높을수록 데이터를 연산할 때 자연스럽게 더 많은 CPU가 소모되며, 그 반대의 경우도 마찬가지입니다. Redis는 특수 인코딩과 관련된 다양한 임계값을 설정하기 위해 다음과 같은 구성 매개변수 세트를 제공합니다.
#如果Hash中字段的数量小于参数值,Redis将对该Key的Hash Value采用特殊编码。 hash-max-zipmap-entries 64 #如果Hash中各个字段的最大长度不超过512字节,Redis也将对该Key的Hash Value采用特殊编码方式。 hash-max-zipmap-value 512 #下面两个参数的含义基本等同于上面两个和Hash相关的参数,只是作用的对象类型为List。 list-max-ziplist-entries 512 list-max-ziplist-value 64 #如果set中整型元素的数量不超过512时,Redis将会采用该特殊编码。 set-max-intset-entries 512
인코딩된 값이 수정 후 구성 정보의 값을 초과하는 경우 최대 제한이 다음과 같은 경우 도달하면 Redis는 이를 자동으로 일반 인코딩 형식으로 변환합니다. 그러나 이를 역으로 수행하고 더 큰 값의 일반 인코딩을 특수 인코딩으로 변환하는 경우 Redis가 제안하는 것은 공식적으로입니다. 이러한 변환은 종종 매우 비효율적이기 때문에 변환 효율성을 간단히 테스트하는 것이 가장 좋습니다.
2. BIT 및 바이트 수준 작업:
Redis 2.2부터 Redis는 4개의 문자를 제공합니다: GETRANGE/SETRANGE/GETBIT/SETBIT 문자열 유형 키/ 값 명령. 이러한 명령을 통해 배열을 운영하는 것처럼 문자열 유형 값 데이터에 액세스할 수 있습니다. 예를 들어 사용자를 고유하게 식별하는 ID는 문자열 값의 하위 문자열일 수 있습니다. 이러한 방식으로 GETRANGE/SETRANGE 명령을 통해 쉽게 추출할 수 있습니다. 또한 BITMAP을 사용하여 남성은 1, 여성은 0과 같이 사용자의 성별 정보를 나타낼 수 있습니다. 이 방법을 사용하여 1억 명의 사용자의 성별 정보를 표현할 때 저장 공간은 12MB만 차지하며 동시에 SETBIT/GETBIT 명령을 통한 데이터 탐색도 매우 효율적입니다.
3. Hash를 최대한 활용하라:
Hash 형태의 데이터가 상대적으로 작은 공간을 차지하기 때문에, 사용자 등록과 같은 실제 응용에서는 Hash 형태를 최대한 활용하는 것을 고려해야 한다. 이름, 성별, 이메일, 나이, 비밀번호 등의 필드가 포함된 정보입니다. 물론 이 정보는 Key 형태로 저장할 수 있고, 사용자가 입력한 정보는 String Value 형태로 저장됩니다. 하지만 Redis는 Hash 형태로 저장하는 것을 선호하며, 위의 정보는 Field/Value 형태로 표현됩니다.
이제 Redis의 저장 메커니즘을 학습하여 이 진술을 더욱 증명하겠습니다. 특별한 인코딩 메커니즘은 이 블로그의 시작 부분에서 언급되었으며 해시 유형과 관련된 두 가지 구성 매개변수인 hash-max-zipmap-entries와 hash-max-zipmap-value가 있습니다. 그 활동 범위에 대해서는 이전에 설명했으므로 여기서는 자세히 설명하지 않겠습니다. 이제 Hash Value에 저장된 필드 수가 hash-max-zipmap-entries보다 작고, 각 요소의 길이도 hash-max-zipmap-value보다 작다고 가정해 보겠습니다. 이러한 방식으로 새로운 해시 유형 키/값 저장소가 있을 때마다 Redis는 해시 값을 위한 고정 길이 공간을 생성합니다. 사전 할당된 최대 바이트 수는 다음과 같습니다.
total_bytes = hash-max-zipmap- entries * hash -max-zipmap-value
이런 방식으로 Hash의 모든 필드 위치가 예약되어 있으며 필드/값은 배열에 액세스하는 것처럼 무작위로 액세스할 수 있습니다. 이들 사이의 단계 간격은 hash-max입니다. -zipmap- 값. 해시 값의 필드 수 또는 새 요소의 길이가 각각 위의 두 매개변수 값을 초과하는 경우에만 Redis는 이를 해시 테이블 형식으로 다시 저장하는 것을 고려합니다. 그렇지 않으면 항상 효율적인 저장을 유지합니다. 그리고 접근. 뿐만 아니라, 각 Key는 String 형식의 Key/Value에 비해 만료 시간, LRU 등 일부 관련 시스템 정보를 저장해야 하므로 Hash 형식은 Key 개수(대부분의 Key가 표현되어 형식으로 저장됨)를 크게 줄입니다. 해시 필드)을 통해 저장 공간의 사용 효율성을 더욱 최적화합니다.
위 내용은 Redis Tutorial(14): 메모리 최적화 소개의 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!