>백엔드 개발 >PHP 튜토리얼 >Redis의 데이터 유형은 무엇입니까? Redis의 다양한 데이터 유형 요약

Redis의 데이터 유형은 무엇입니까? Redis의 다양한 데이터 유형 요약

不言
不言원래의
2018-09-13 17:20:386846검색

이 기사에서는 Redis 데이터 유형이 무엇인지 설명합니다. Redis의 각 데이터 유형에 대한 요약에는 특정 참조 값이 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Foreword

  1. redis는 ANSI C 언어로 작성된 오픈 소스 로그 유형, 키-값 데이터베이스이며, 네트워크를 지원하고, 메모리 기반 및 지속성이 가능하며, 여러 언어로 API를 제공합니다.

  2. 데이터베이스, 캐시 및 메시지 대기열 브로커로 사용할 수 있는 인메모리 데이터 구조 서버입니다.

  3. 데이터 랜딩 기능을 제공하면서 메모리 내 모든 데이터를 통해 고속 액세스를 보장합니다. 이것이 Redis의 주요 적용 시나리오입니다.

  4. reids에는 복제, Lua 스크립트, LRU 회수, 트랜잭션 및 다양한 수준의 디스크 지속성 기능이 내장되어 있으며 Redis Sentinel을 통해 고가용성을 제공하고 Redis 클러스터를 통해 자동 파티셔닝을 제공합니다.

  5. redis는 문자열, 해시 테이블, 목록, 집합, 순서 집합, 비트맵, 하이퍼로그 로그 및 기타 데이터 유형을 지원합니다.

  6. 가장 일반적으로 사용되는 Redis 데이터 유형: Stirng, hash, list, set, sorted set, pub/sub, transaction.

문자열 유형

  1. 문자열 유형은 간단한 키-값 유형입니다. 값은 문자열뿐만 아니라 숫자도 됩니다.

  2. 일반적으로 사용되는 명령: set, get, decr, incr, mget 등

  3. memcached와 동일한 get, set, incr, decr 및 기타 작업을 제공하는 것 외에도 redis는 다음 작업도 제공합니다.

(1) 문자열 길이 가져오기
(2) 문자열에 추가 Content;
(3) 문자열의 특정 내용을 설정하고 가져옵니다.
(5) 일련의 문자열 내용을 일괄적으로 설정합니다.

hash는 특히 물건을 저장하는 데 적합합니다.

  1. 일반적으로 사용되는 명령: hget, hset, hgetall 등

  2. 응용 시나리오: 사용자의 닉네임, 나이, 성별, 포인트 등과 같은 일부 구조화된 데이터를 저장하고 사용자 정보 객체 데이터를 저장합니다.

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

  4. (1) 사용자 ID는 검색 키입니다. 2) 저장 값에는 이름, 나이, 생일 및 기타 정보가 포함됩니다.

  5. 1. 분석 예:

(1) 키는 사용자 ID이고 값은 맵입니다.
(2) 이 맵의 키는 멤버의 속성 이름이고 값은 속성 값입니다.

(3) 이러한 방식으로 내부 맵 키(redis)를 통해 데이터 수정 및 액세스가 직접 가능합니다. 내부 Map 키 필드를 호출합니다. 즉, 키(사용자 이름 id) + 필드(속성 이름)로 해당 속성 데이터를 조작할 수 있습니다.

2. 참고:


(1) Redis는 모든 속성 데이터를 직접 얻을 수 있는 인터페이스(hgetall)를 제공하지만 내부 맵에 멤버가 많은 경우 전체 맵을 순회해야 합니다.
(2) Redis의 단일 스레드 모델로 인해 이 순회 작업은 시간이 많이 걸릴 수 있으며 다른 클라이언트 요청에 전혀 응답하지 않을 수 있다는 점에 유의해야 합니다.

목록 유형


목록 유형은 기본적으로 각 요소가 문자열 유형인 이중 연결 목록이므로 목록을 스택이나 대기열로 사용할 수 있습니다.

  1. 목록 유형은 여러 프로그램 간의 메시지 교환을 완료하기 위해 메시지 대기열 서비스에서 자주 사용됩니다.

  2. 일반적으로 사용되는 명령: lpush, rpush, lpop, rpop, lrange 등

  3. 응용 시나리오: 최신 뉴스 순위 및 메시지 대기열과 같은 기능을 구현합니다.

  4. 간단한 메시지 대기열 예제 분석:

  5. (1) 응용 프로그램이 연결 목록에 새 요소를 추가하기 위해 lpush를 실행한다고 가정합니다. 우리는 일반적으로 이러한 프로그램을 "생산자"라고 부릅니다.

    ( 2) 다른 응용 프로그램이 수행 중입니다. 연결된 목록에서 요소를 제거하는 rpop 작업. 우리는 이러한 프로그램을 "소비자"라고 부릅니다.

    (3) 소비자가 메시지를 소비하는 동안 목록에 보류 중인 메시지가 있는지 확인하려면 rpop을 계속 호출해야 합니다. 호출할 때마다 링크가 시작되어 불필요한 낭비가 발생합니다.
  6. (4) 또한 생산자 속도가 소비자 속도보다 크면 메시지 대기열의 길이가 계속 증가하여 시간이 지남에 따라 많은 메모리 공간을 차지하게 됩니다.
(5) 따라서 다음을 사용할 수 있습니다. brpop 명령은 반환 요소가 있는 경우에만 사용할 수 있습니다. 그렇지 않으면 시간 초과될 때까지 차단되고 null을 반환합니다.


Set type


set 유형은 문자열 유형의 순서가 지정되지 않은 모음입니다.

  1. 세트의 개념은 고유한 값의 집합입니다.

  2. set 요소는 최대 (2의 32승 - 1)개의 요소를 포함할 수 있습니다.

  3. set의 내부 구현은 값이 항상 null인 HashMap입니다.

  4. 세트에서 제공하는 외부 기능은 리스트 기능인 리스트와 유사합니다. 특이한 점은 세트 중에 중복 항목을 자동으로 제거할 수 있다는 것입니다.

  5. 일반적인 명령: sadd, spop, smembers, sunion 등

  6. 데이터 목록을 저장해야 하고 중복된 데이터가 표시되는 것을 원하지 않는 경우 set이 좋은 선택입니다.

  7. 그리고 세트는 목록이 제공할 수 없는 세트 컬렉션에 구성원이 있는지 여부를 확인하는 중요한 인터페이스를 제공합니다.

  8. 세트 데이터 구조를 사용하면 일부 집합 데이터를 저장할 수 있습니다. 예를 들어 Weibo 애플리케이션에서는 사용자의 모든 팔로어를 세트에 저장할 수 있으며 모든 팬을 세트에 저장할 수 있습니다.

  9. redis는 집합에 대한 교집합, 합집합, 차이 등의 연산도 제공하므로 공통 관심, 공통 선호, 2급 친구 등의 기능을 구현하는 데 매우 편리할 수 있습니다.

Zset type

  1. set과 마찬가지로 sorted set도 Stirng 유형 요소의 모음입니다. 차이점은 각 요소가 이중 유형 점수와 연관되어 있으며 요소의 순서는 점수에 따라 결정된다는 점입니다.

  2. sorted set은 삽입 순서, 즉 자동 정렬입니다.

  3. 일반적으로 사용되는 명령: zadd, zrange, zrem, zcard 등

  4. 정렬되고 중복되지 않은 세트 목록이 필요한 경우 정렬된 세트 데이터 구조를 선택할 수 있습니다.

  5. 적용 예시:

(1) 예를 들어 학급 전체의 성적을 저장하기 위해 설정값은 동급생의 학생 번호, 점수는 성적이 될 수 있습니다.
(2) 순위 적용, 점수를 기준으로 상위 N명의 사용자 나열 등

pub/sub

  1. subscribe, unsubscribe 및 게시는 게시 및 구독 일반을 구현하는 세 가지 명령입니다.

  2. 발신자(정보를 보내는 클라이언트)가 특정 수신자(정보를 받는 클라이언트)에게 직접 정보를 보내는 것이 아니라, 채널(채널)로 정보를 보내고, 채널(채널)은 정보를 전달합니다. 이 채널에 관심이 있는 모든 구독자.

  3. 발신자는 구독자에 대한 정보를 알 필요가 없으며 구독자는 어떤 클라이언트가 정보를 보냈는지 알 필요가 없으며 관심 있는 채널에만 주의하면 됩니다.

  4. 매우 가볍고 간결하게 설계된 Redis의 게시/구독은 메시지 게시 및 구독의 기본 기능을 달성하지만 아직 메시지 지속성과 같은 다양한 엔터프라이즈 수준 기능을 제공하지 않습니다.

  5. redis 클라이언트는 메시지를 게시하고 다른 여러 redis 클라이언트는 메시지를 구독하는 즉시 삭제됩니다. Redis는 게시된 메시지를 유지하지 않고 이전에 구독한 메시지만 받을 수 있습니다. 해당 채널의 뉴스를 볼 수 없습니다.

  6. 메시지 게시자, 즉 게시 클라이언트에는 전용 링크가 필요하지 않습니다. 메시지를 게시하는 동안 동일한 redis-client 링크를 사용하여 incr 등의 다른 작업을 수행할 수 있습니다.

  7. 메시지 구독자, 즉 구독 클라이언트에는 독점 링크가 필요합니다. 즉, redis-client는 구독 기간 동안 다른 작업을 방해할 수 없습니다.
  8. 이때 클라이언트는 게시측의 메시지를 차단하는 방식으로 기다리고 있으므로 구독은 별도의 링크를 사용하거나 추가 스레드에서 사용해야 합니다.
  9. tcp 기본 연결 시간은 고정되어 있습니다. 이 세계에서 서브 측이 pub 측 메시지를 수신하지 않거나 pub 측에서 메시지를 생성하지 않으면 서브 측 연결이 강제로 재활용됩니다.
  10. 이 문제를 해결하려면 타이머를 사용하여 Pub과 Sub 간의 연결 유지 메커니즘을 시뮬레이션해야 합니다. 타이머 시간은 최대 TCP 연결 시간을 초과할 수 없습니다.
  11. 구독 종료로 인해 링크 연결이 끊어지면 일부 메시지가 손실됩니다. 즉, 링크 실패 기간 동안의 메시지가 손실됩니다. 따라서 지속성을 위해 Redis 목록을 고려해야 합니다. 각 메시지에 세심한 주의를 기울이고 redis를 기반으로 추가 보완 작업을 수행해야 합니다. 구독이 지속되도록 하려면 다음 디자인 아이디어를 참고로 사용할 수 있습니다.
  12. (1) 구독 측면: 먼저 세트 컬렉션에 "구독자 ID"를 추가하면 이 세트는 "활성 구독자"를 저장합니다. 구독자 ID는 각 고유 구독자를 표시하며 이 세트는 "활성 구독자 세트"입니다.
  13. (2) 구독 측은 구독 작업을 시작하고 redis를 기반으로 구독자 ID를 키로 사용하여 목록 데이터 구조를 생성합니다. 이 목록을 "구독자 메시지 대기열"이라고 합니다. 게시 측: 각 메시지가 게시된 후 게시 측은 활성 구독자 컬렉션을 순회하고 게시된 메시지를 각 "구독자 메시지 대기열"의 꼬리에 차례로 추가해야 합니다.

    (4) 지금까지는 기본적으로 다음이 보장됩니다. 게시된 모든 메시지는 각 "구독자 메시지 대기열"에 유지됩니다.

    (5) 구독 측에서는 구독 메시지가 수신될 때마다 몇 주 동안 사용한 후 자체 "구독"을 삭제해야 합니다. 구독 종료가 시작되면 "구독자 메시지 큐"에 남은 레코드가 있는 것으로 확인되면 먼저 해당 메시지를 사용한 다음 구독합니다.


위 방법을 사용하면 성공적으로 도착한 메시지가 손실되지 않고 소비되어야 합니다.



transactions

  1. redis 트랜잭션은 한 번에 여러 명령을 실행할 수 있습니다.

트랜잭션은 시작부터 실행까지 세 단계를 거칩니다.

  1. (1) 트랜잭션 시작

    (2) 명령 대기열
  2. (3) 트랜잭션 실행
  3. 트랜잭션은 트랜잭션 내에서 별도의 격리된 작업입니다. 모든 명령은 직렬화되어 순서대로 실행됩니다.

    트랜잭션 실행 중에는 다른 클라이언트가 보낸 명령 요청으로 인해 중단되지 않습니다.

    단일 Redis 명령의 실행은 원자성이지만 Redis는 트랜잭션의 원자성을 유지하기 위한 메커니즘을 추가하지 않으므로 Redis 트랜잭션의 실행은 원자성이 아닙니다.

    트랜잭션은 패키지된 배치 실행 스크립트로 이해될 수 있지만 배치 명령은 원자성 작업이 아닙니다. 중간에 명령이 실패해도 이전에 실행된 명령이 롤백되거나 후속 명령이 실행되지 않습니다. .

    multi, exec, Discard 및 watch 명령은 Redis 트랜잭션의 기초입니다.

    multi:

    (1) multi 명령은 트랜잭션을 시작하는 데 사용되며 항상 ok를 반환합니다.
    (2) 다중 명령이 실행된 후 클라이언트는 계속해서 원하는 만큼의 명령을 서버에 보낼 수 있습니다.
    (3) 이러한 명령은 즉시 실행되지 않지만 대기열에 배치됩니다. exec 명령은 호출되면 대기열의 모든 명령이 실행됩니다.

    exec:

    (1) exec 명령은 트랜잭션의 모든 명령을 트리거하고 실행하는 역할을 담당합니다.

    (2) 다중을 사용하여 트랜잭션을 연 후 연결이 끊어져 클라이언트가 exec 명령을 성공적으로 실행하지 못하는 경우 , 그러면 트랜잭션의 모든 명령이 실행되지 않습니다.
    (3) 반면, 클라이언트가 트랜잭션을 연 후 exec 명령을 성공적으로 실행하면 트랜잭션의 모든 명령이 실행됩니다.

    discard:

    (1) Discard를 호출하면 클라이언트는 트랜잭션 대기열을 지우고 트랜잭션 실행을 포기할 수 있습니다.


    watch:

    (1) watch 명령은 Redis 트랜잭션에 대한 확인 및 설정(CAS) 동작을 제공할 수 있습니다.

    (2) watch를 사용하면 exec 명령을 조건부로 실행할 수 있습니다. 모니터링되는 모든 키가 수정되지 않았다는 전제 하에서만 트랜잭션을 실행할 수 있습니다. 이 조건이 충족되지 않으면 트랜잭션이 실행되지 않습니다.
    (3) watch를 사용하여 만료 시간이 있는 키를 모니터링하면 키가 만료되더라도 트랜잭션이 계속 실행될 수 있습니다.
    (4) watch는 여러 번 호출할 수 있으며, watch가 실행되는 시점부터 exec가 호출될 때까지 상태 모니터링이 적용됩니다.
    (5) exec가 호출되면 트랜잭션 성공 여부에 관계없이 모든 Health 모니터링이 취소됩니다.
    (6) 클라이언트가 링크 연결을 끊으면 클라이언트의 상태 모니터링도 취소됩니다.

    관련 권장 사항:

    Redis 데이터 유형--문자열

    Redis 기본 데이터 유형 및 관련 작업

위 내용은 Redis의 데이터 유형은 무엇입니까? Redis의 다양한 데이터 유형 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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