>  기사  >  데이터 베이스  >  Redis는 언제 해시 유형을 사용합니까?

Redis는 언제 해시 유형을 사용합니까?

尚
원래의
2019-07-04 16:16:093648검색

Redis는 언제 해시 유형을 사용합니까?

해시 유형은 문자열 유형의 필드 및 값 매핑 테이블 또는 문자열 컬렉션에 비해 객체 유형 저장에 특히 적합합니다. Hash 유형으로 저장하면 String 유형 클래스에 저장하는 것보다 메모리 공간을 덜 차지하며 전체 객체에 더 쉽게 액세스할 수 있습니다.

Redis에서 해시 유형은 다음 형식의 키-값 쌍 구조이기도 한 키 값 자체를 나타냅니다. value={{field1,value1},{field2,value2},{ fieldN,valueN }},

일반적으로 사용되는 명령:

hget,hset,hgetall 등

응용 시나리오:

Hash의 응용 시나리오를 설명하기 위해 간단한 예를 들어 보겠습니다. 예를 들어 다음 정보를 포함하는 사용자 정보 개체 데이터를 저장하려고 합니다.

사용자 ID는 검색 키입니다.

저장된 값 사용자 개체에는 이름, 나이, 생일 및 기타 정보가 포함됩니다.

일반적인 키/값 구조를 사용하여 저장하는 경우 두 가지 주요 저장 방법이 있습니다.

첫 번째 방법은 사용자 ID를 검색 키로 사용하고 기타 정보를 캡슐화합니다. 객체로 변환하여 직렬화된 방식으로 저장됩니다.

예: set u001 "lee三,18,20010101"

이 방법의 단점은 직렬화/ 역직렬화에 따른 오버헤드와 정보 중 하나를 수정해야 하는 경우 전체 개체를 검색해야 하며 수정 작업은 동시성을 보호해야 하므로 CAS와 같은 복잡한 문제가 발생합니다.

두 번째 방법은 사용자 정보 객체에 멤버 수만큼 키-값 쌍을 저장하고, 사용자 ID + 해당 속성의 이름을 고유 식별자로 사용하여 값을 얻는 것입니다. 다음과 같은 해당 속성의 mset user:001:name "lee三 "user:001:age18 user:001:birthday "20010101"

직렬화 오버헤드 및 동시성 문제는 제거되었지만 사용자는 ID가 반복적으로 저장되어 있다면 이러한 데이터의 양이 많다면 여전히 메모리 낭비가 매우 클 것입니다.

그렇다면 Redis에서 제공하는 Hash는 이 문제를 매우 잘 해결합니다. Redis의 Hash는 실제로 값을 HashMap으로 내부에 저장하고 이 Map의 구성원에 직접 액세스할 수 있는 인터페이스를 제공합니다.

예: hmset user:001 이름 "이삼" 나이 18 생일 "20010101"

즉, 키는 여전히 사용자 ID이고 값은 이 Map. 키는 멤버의 속성 이름이고 값은 속성 값입니다. 이러한 방식으로 데이터에 대한 수정 및 액세스는 내부 Map의 키(내부의 키)를 통해 이루어질 수 있습니다. Redis에서는 Map을 field라고 한다. 즉, 키(사용자 ID) + 필드(속성 태그)를 통해 해당 속성 데이터를 동작시킨다. 데이터를 반복적으로 저장할 필요가 없으며, 직렬화 및 동시 수정에 문제가 발생하지 않는다. 제어. 문제를 아주 잘 해결했습니다. 여기서 주의할 점은 Redis에서는 모든 속성 데이터를 직접 얻을 수 있는 인터페이스(hgetall)를 제공한다는 점이다. 그러나 내부 Map의 멤버가 많은 경우에는 단일 스레드로 인해 전체 내부 Map을 순회하는 작업이 수반된다. Redis 모델의 경우 이 순회 작업은 시간이 더 많이 걸릴 수 있으며 다른 클라이언트 요청은 전혀 응답하지 않으므로 특별한 주의가 필요합니다.

구현 방법: 위에서 언급했듯이 값에 해당하는 Redis Hash는 실제로 HashMap입니다. 실제로 Hash의 멤버 수가 적을 때 Redis는 비슷한 것을 사용합니다. 실제 HashMap 구조를 사용하지 않고 콤팩트하게 저장하기 위한 차원 배열입니다. 해당 값 redisObject의 인코딩은 멤버 수가 증가하면 자동으로 실제 HashMap으로 변환됩니다. ht입니다.

Redis 관련 지식을 더 보려면 Redis 사용 튜토리얼 컬럼을 방문하세요!

위 내용은 Redis는 언제 해시 유형을 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.