>  기사  >  백엔드 개발  >  5가지 Redis 데이터 구조에 대한 자세한 설명

5가지 Redis 데이터 구조에 대한 자세한 설명

小云云
小云云원래의
2018-03-12 15:17:485654검색

이 기사에서는 주로 5가지 Redis 데이터 구조에 대한 자세한 설명을 공유합니다. 기사의 사례와 코드가 모든 사람에게 도움이 되기를 바랍니다.

2.1.1 전역 명령

1 모든 키 보기 key*

2 총 키 수 dbsize (dbsize 명령은 총 키 수를 계산할 때 모든 키를 순회하지 않고 직접 총 키 수를 구합니다. Redis 변수에 내장되어 있으며 시간 복잡도는 O(1)이고 키 명령은 모든 키를 통과하며 시간 복잡도는 O(n)입니다. Redis가 많은 수의 키를 저장하는 경우에는 사용이 금지됩니다. 온라인 환경)

3 키가 있는지 확인합니다. 키가 있습니다. 반환 1, 반환이 없습니다. 0

4 삭제 키 Del 키 삭제에 성공한 키 수로 돌아갑니다. -2 키가 존재하지 않습니다. 键 6 -key. 데이터 유형 구조 유형 키 반환 유형, 반환 없음 없음

2.1.2 데이터 구조 및 내부 인코딩


각 데이터 구조에는 자체 내부 코딩 구현이 있으며 여러 구현이 있으므로 Redis는 적절한 것을 선택합니다. 각 데이터 구조에는 두 개 이상의 내부 인코딩 구현이 있습니다. 예를 들어 목록 데이터 구조에는 두 개의 내부 인코딩이 포함되어 있습니다: linkedlist 및 ziplist 객체 인코딩 명령을 통해 내부 인코딩을 쿼리합니다. ~ ~ 둘째, 여러 내부 코딩 구현은 다양한 시나리오에서 각각의 이점을 발휘할 수 있습니다. 예를 들어 ziplist는 메모리를 절약하지만 목록 요소가 많으면 성능이 저하됩니다. 이때 Redis는 구성 옵션에 따라 목록 유형의 내부 구현을 linkedlist로 변환합니다.


2.1.3 단일 스레드 아키텍처


Redis 단일 스레드 아키텍처 및 I/O 다중화 모델을 사용하여 고성능 인 메모리 데이터베이스 서비스 구현


  1 단일 스레드 모델로 이어짐

                                       > ~   . 기억 속에는 메모리의 응답 시간은 약 100나노초이며 이는 Redis가 초당 10,000 수준의 액세스를 달성하는 데 중요한 기반입니다. 두 번째, 비차단 I/O인 Redis는 I/O 다중화 기술의 구현으로 epoll을 사용합니다. Redis 고유의 이벤트 처리 모델을 사용하여 epoll의 연결, 읽기, 쓰기, 종료를 이벤트로 변환하여 경쟁으로 인한 네트워크 I/O 소비에 너무 많은 시간을 낭비하지 않습니다ㅋㅋㅋ                                                                                                      단일 스레드는 여러 가지 이점을 제공합니다. 첫째, 단일 스레딩은 데이터 구조 및 알고리즘의 구현을 단순화합니다. 둘째, 단일 스레딩은 스레드 전환 및 경쟁 조건으로 인한 소비를 방지합니다. 그러나 각 명령의 실행에는 요구 사항이 있습니다. 특정 명령의 실행 시간이 너무 길면 다른 명령이 차단됩니다. Redis는 빠른 실행 시나리오를 위한 데이터베이스입니다.

2.2 문자 문자열의 유형 Redis는 여러 다른 유형의 기초입니다. 값은 문자열(단순, 복합 JSON, XML), 숫자(정수, 부동 소수점), 바이너리(그림, 오디오, 비디오), 가장 큰 값은 512MB를 초과할 수 없습니다



2.2.1 명령

1 공통 명령


1 설정 값 SET 키 값 초 만료 시간 밀리초 만료 시간 nx | setxx




                애플리케이션 시나리오: Redis는 단일 스레드 명령 처리 메커니즘이므로 여러 클라이언트가 동시에 setnx 키 값을 실행하는 경우 특성에 따라 하나의 클라이언트만 성공적으로 설정할 수 있습니다. 분산 잠금을 위한 구현 솔루션으로 사용할 수 있습니다


                                                          get 키가 존재하지 않고 nil을 반환합니다


3 값 설정 mset 키 값 일괄 처리 효율성이 높지만 명령이 너무 제어되지 않는다는 점에 주의하세요. 많은 경우 Redis 차단 또는 네트워크 정체가 발생합니다. 5 count incr key


값이 정수가 아니고 오류가 반환됩니다.

存 키의 결과가 존재하지 않습니다. 값이 0이므로 반환 결과는 다음과 같습니다. 1

및 DECR(자체 감소), INCRBY(자체 증가 지정 숫자), DECRBY 부동 소수점 수 추가)

                                             > 지정된 위치를 설정합니다. Character SetRANGE Key Offset Value

5 일부 문자열 가져오기 GetRANGE Key Start End

2.2.2 내부 코딩


문자열 내부의 3가지 유형: Int 39단어 미만의 8바이트의 8바이트 섹션 문자열 원시 39바이트보다 큰 문자열. Redis는 현재 값의 유형과 길이에 따라 사용할 내부 인코딩을 결정합니다.


2.2.3 일반적인 사용 시나리오


ㅋㅋㅋ                                                   . Redis에는 동시성을 지원하는 기능이 있으므로 캐싱은 일반적으로 읽기 및 쓰기 속도를 높이고 백엔드 부담을 줄이는 역할을 할 수 있습니다.                                                         3개의 공유 세션



4개 속도 제한 IP 주소는 다음과 같을 수 없습니다. 1초에 n번 이상 접근이 가능합니다

2.3 Hash


ㅎㅎ 희망하는 타입은 키 값 자체가 구조체의 키 값입니다


2.3.1 명령어

1개 설정 값


HSET 키 필드 값


2 hdel 키 필드

                                       ~                                                 


7 모든 필드 가져오기 HKEYS 키 s 8 모든 값 HVALS 키 가져오기


9 모든 필드 값 HGETALL 가져오기 키

개발 팁: 모든 필드 값을 가져와야 하는 경우 HSCAN 명령을 사용할 수 있습니다. 해시 유형

10 hincrby hincrby float

11 값의 문자열 길이 계산 hstrlen 키 필드 2.3.2 내부 인코딩

내부 인코딩에는 두 가지 유형이 있습니다.

                  ziplist(압축 목록) 해시 요소 수

Hashtable(해시 테이블) Hash 유형이 Ziplist 조건을 충족할 수 없는 경우 읽기 및 쓰기가 가능하므로 선택하세요. 해시테이블의 시간은 O(1)

2.3.3 장면 사용


        

UserInfo getUserInfo(long id){
userRedisKey="user:info:"+id;
userInfoMap=redis.hgetAll(userRedisKey);
userInfoMap userInfo;

if(userInfoMap!=null){
userInfo=transferMapToUserInfo(userInfoMap);
}else{
userInfo=mysql.get(id);
redis.hmset(userRedisKey,tranferUserInfoToMap(userInfo));
redis.expire(userRedisKey,3600);
}
return userInfo;
}

             哈希类型和关系型数据库两点不同:

                1 哈希类型是稀疏的,而关系型数据库是完全结构化的

                2 关系型数据库可以做复杂的查询,而Redis去模拟关系型复杂查询开发困难,维护成本高

            三种方法缓存用户信息

                1 原声字符串类型:每个属性一个键

                    

               

                优点:简单直观,每个属性都支持更新操作

                缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以一般不会在生产环境用

               2 序列化字符串类型:将用户信息序列化后用一个键保存

        

                优点:简化编程,如果合理的使用序列化可以提高内存的使用效率

                缺点:序列化和反序列化有一定的开销,同时每次更新属性,都需要把数据取出来反序列化,更新后再序列化到Redis中

                3 哈希类型:每个用户属性使用一对field-value,但是只用一个键保存

                优点:简单直观,如果使用合理,可以减少内存空间的使用

                缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多的内存

    2.4 列表

        列表类型用来存储多个有序的字符串,一个列表最多存储2的32次方-1个元素,列表是一种比较灵活的数据结构,它可以灵活的充当栈和队列的角色,在实际开发上有很多应用场景

        列表有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。第二、列表中的元素可以是重复的

        2.4.1 命令

            1 添加操作

                 1.1 从右边往左插入元素 rpush key value

                 1.2 从左往右插入元素 lpush key value

                 1.3 向某个元素前或者后插入元素 linsert key before|after pivot value

                    

            2 查找

                1 获取指定范围内的元素列表 lrange key start end            

                    인덱스 첨자는 두 가지 특성을 갖습니다. 첫째, 인덱스 첨자는 왼쪽에서 오른쪽으로 0-n-1이고 오른쪽에서 왼쪽으로 -1--n입니다. 둘째, lrange의 끝 옵션은 자체적으로 포함됩니다. 프로그래밍 언어에는 다양한 END가 포함되어 있습니다

2 인덱스 lindex 키 인덱스를 지정하는 요소 목록 가져오기

3 목록 길이 가져오기 Llen Key

3 삭제右 2 RPOP 키

3 팝업 목록 오른쪽에서 지정된 요소 삭제 LREM Key Count Value

4 인덱싱 범위에 따라 LTRIM KEY 시작 END

4 수정


지정된 인덱스의 요소 수정 LSET Key Index Newvalue 5 차단 작업 BRPOP BLPOP Key Time

1개 목록이 비어 있음: Timeout = 3인 경우 클라이언트는 3초까지 기다렸다가 즉시 반환되어야 합니다.

          2 목록이 비어 있지 않음: 클라이언트가 즉시 반환


                                                                                내부에는 두 가지가 있습니다. 목록 유형에 대한 인코딩


목록 요소 수


      ziplist의 조건이 충족되지 않으면 Redis는 목록의 내부 구현으로 linkedlist를 사용합니다. 2.4.3 사용 시나리오

차단 대기열

                                                     

기사 목록 2개 个 두 가지 질문: 첫째, 페이지가 많아질 때마다 기사를 얻으려면 여러 HGETALL 작업을 수행해야 합니다. 이때 문자열 유형은 mget을 사용하여 일괄적으로 가져옵니다. 둘째, 페이징으로 기사 목록을 얻을 때 lrange 명령은 목록의 양쪽 끝에서 더 나은 성능을 가지지만, 목록이 커지면 목록의 중간 범위 요소를 얻는 성능이 나빠집니다. 2단계 분할을 고려할 수 있습니다

                                                              

lpush+lpop=Stack(stack) lp ush+rpop=대기열(대기열)

lpush+rpop=대기열 lpsh+ltrim=최대 컬렉션(수집 제한)

+LPush+BRPOP = MESSAGE QUEUE (Message Quest)


Cathery 2.5 컬렉션


컬렉션은 여러 문자열 요소를 저장하는 데 사용됩니다. 목록과 다른 점은 허용되지 않는 반복 요소가 있으며 컬렉션에 포함된 요소입니다.


2.5.1 명령


1 컬렉션 내 작업


1.1 요소 추가 sadd 키 요소 1.2 요소 삭제 rem 키 요소


1.3 요소 흉터 키 수 계산


1.4 요소가 집합에 있습니다 sismember 키 요소


1.5 컬렉션에서 지정된 수의 요소를 무작위로 반환 srandmember 키


1.6 컬렉션 spop 키에서 요소를 무작위로 팝업 1.7 모든 요소 가져오기 smembers 키


        2 컬렉션 간 작업


                                                                      집합의 교차 소결 키... 2 여러 집합의 합집합 수이논 키를 찾아보세요..


3 여러 세트의 차이 sdiff 키 찾기 4 교차점, 차이 및 합집합 결과가 저장됩니다


SintersStore Destination 키


SDIFFSTORE DESTION 키


SUIONSTORE DESTIONTION KEY



2.5.2 내부 인코딩


두 가지 내부 유형이 있습니다:


intSET 테거 무결성 세트): set은 모두 정수이고 요소 수는 set-max-intset-entries 구성(기본값 512)보다 적습니다. Redis는 intset을 세트의 내부 구현으로 사용하여 메모리 사용량을 줄입니다

해시 테이블(해시 테이블) 컬렉션 유형이 intset 조건을 충족할 수 없는 경우 Redis는 해시테이블을 컬렉션의 내부 구현으로 사용합니다.

2.5.3 사용 시나리오


컬렉션 유형의 일반적인 응용 시나리오는 태그입니다. ​​​​Sadd tag1:users user:1 user:3


개발 팁: 사용자 및 태그 부분 명령 실패로 인한 데이터 불일치를 방지하려면 트랜잭션 내에서 관계 유지 관리를 수행해야 합니다.


srem tag1:users user: 1

感 5 사용자가 관심있는 라벨을 함께 계산합니다. Sinter User: 1 TAGS User: 2 Tags


개발팁: Sadd = 태깅 /srandmember=랜덤 아이템(복권 등 난수 생성) sadd+sinter=소셜 그래프 (사회적 필요)


2.6 순서 세트

순서 세트는 세트에 점수를 정렬하기위한 기초로 점수를 추가하는 것입니다. 집합에 비해 정렬 필드가 있지만 가격도 생성됩니다. ZADD의 시간 복잡도는 o(log(n))이고 SADD의 시간 복잡도는 O(1) 计 2 구성원 수를 계산합니다

Scard Key

3 회원 점수 계산 ZSCORE Key Member

4 회원 순위 계산 Zrank Key Member

5 회원 삭제 Zrem Key Member

              6 增加成员的分数zincrby 키 증분 멤버

                7 返回指定ZRANGE 키 시작 엔드

8 返回 返回 分数 范围 的 成员 成员 成员 成员 成员 成员 成员 返回 返回 指定 范围 范围 个数 个数 个数 个数 个数



1 1 Intersection ZINTERSTORE 대상 numkeys key


N 2 ZunionStore Destionation Numkeys Key


2.6.2 내부 인코딩


질서 있는 컬렉션 유형에는 두 개의 내부 코드가 있습니다:


Ziplist -ziplist-entries 구성, 그리고 각각의 값이 요소가 zset-max-ziplist-value 구성보다 작으면 Redis는 ziplist를 주문 세트의 내부 구현으로 사용합니다. ziplist는 메모리 사용량을 효과적으로 줄일 수 있습니다.

     Skip list) ziplist 조건이 충족되지 않으면 주문된 세트가 내부 구현으로 Skiplist를 사용할 것이므로 이때 ziplist의 읽기 및 쓰기 효율성이 감소합니다


2.6.3 사용 시나리오


주문 세트의 일반적인 사용 시나리오는 순위 시스템입니다. 예를 들어, 비디오 웹사이트는 사용자가 업로드한 비디오의 순위를 매겨야 합니다


数 1 사용자 좋아요 추가 ZDD 사용자: 순위: 2016_03_15 Mike 3


Zincrby 이후 사용자: 순위: 2016_03_15 mike 1


2 사용자 좋아요 취소


zrem 사용자: 2016_03_15 mike


획득할 수 있는 디스플레이 3개 좋아요 수가 가장 많은 사용자 10명

이 기능은 사용자 이름을 키 접미사로 사용하여 사용자 정보를 해시 유형으로 저장할 수 있습니다. 사용자의 점수 및 순위는 ZCORE 및 ZRANK

두 가지 기능을 사용할 수 있습니다.


2.7 키 관리


2.7.1 단일 키 관리

1 키 이름 바꾸기 키 이름 바꾸기 NewKey

2 무작위 키 반환 무작위 키


3 키 만료 -1 키에 만료 시간이 설정되지 않았습니다. - 2 키가 존재하지 않습니다


키는 초 단위의 타임스탬프 이후 만료됩니다.

Re 1 키 키가 없으면 반환 결과는 0


2. 만료 시간이 음수이면 키가 즉시 삭제됩니다. Del 명령을 사용하는 것과 같습니다. 对于 4 문자열 유형 키의 경우 SET 명령을 실행하면 만료 시간이 제거됩니다. 이 문제는 개발 시 쉽게 무시할 수 있습니다.


5 Redis는 내부 만료 기능을 지원하지 않습니다. 보조 데이터 구조의 요소는 이동 및 덤프 +복원을 포함하여 만료 시간으로 설정되며 세 가지 마이그레이션 키 방법 세트를 마이그레이션하며 구현 방법 및 사용 시나리오가 다릅니다

                1개의 이동이 사용됩니다. Redis 내에서 데이터 마이그레이션

                                                                                                                                      데이터 마이그레이션 기능은 두 단계로 나뉩니다. 1. 소스 Redis에서 dump 명령은 키 값을 직렬화하며 형식은 RDB 형식입니다. 2. 대상 Redis에서는 복원 명령은 위의 값을 직렬화합니다. 값이 복원됩니다. 여기서 ttl 매개변수는 만료 시간을 나타냅니다

E 3 Migrate 명령은 Retis 인스턴스 간 데이터 마이그레이션에 사용됩니다.


2.7.2 Trends


Redis는 모든 키를 순회하는 두 가지 명령을 제공합니다. Keys와 SCAN


1.配 *는 모든 문자의 일치를 나타냅니다.


. 문자와 일치하는 대표


[]는 문자를 나타냅니다.


x는 전송에 사용됩니다. 차단


2 점진적 순회




스캔은 해당 명령에는 hsan, sscan, zcan이 포함됩니다.

                                           >                  1 데이터베이스 전환 선택 dbIndex

2 플러시db/flushall은 데이터베이스를 지우는 데 사용되며 이로 인해 차단이 발생합니다. 2.8 이 장의 마지막 부분에 대한 검토

관련 권장 사항:


Redis 데이터 구조


위 내용은 5가지 Redis 데이터 구조에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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