Redis에는 5가지 기본 데이터 구조가 있습니다: 문자열(문자열), 목록( list), set(집합), hash(해시), zset(ordered set)
문자열 유형은 Java 언어의 ArrayList(숫자 목록)와 유사하게 Redis 값의 가장 간단한 데이터 구조입니다. , 그러나 Redis의 문자열은 동적 문자열입니다.
Redis의 문자열은 중복 공간을 사전 할당하는 방법을 사용합니다
[이미지 업로드 실패...(image-724c60-1537973556456)]
set & get
>set keyname test OK >get keyname test //key如果存在就返回0 >setnx keyname test 0 >exists keyname >del keyname 1 //批量设置 >mset key1 test1 key2 test2 OK //批量获取 >mget key1 key2 1) test1 2) test2
key가 만료되었습니다.
//设置5s后过期 >expire keyname 5 //setex是expire和set的复合写法 >setex keyname 5 test OK //5s后查询 >get keyname NULL
count
ps: 값이 숫자인 경우 incr 및 incrby를 사용하여 count
>set num 10 OK //incr默认加1 >incr num 11 //incrby后面要加上数字 >incrby num ERR wrong number of arguments for 'incrby' command //正确计数 >incrby num 5 16
다음은 redis의 또 다른 데이터 구조인 list를 소개합니다
앞서 Redis에 대해 이야기했습니다. 문자열은 다음과 유사합니다. Java 언어의 ArrayList와 Redis의 목록은 LinkList(연결 목록)와 유사합니다. 연결 목록의 한 가지 특별한 기능은 업데이트 및 추가 속도가 매우 빠르지만 인덱스 쿼리 속도가 느리다는 것입니다.
왜 링크리스트와 비슷하다고 하는 걸까요? 왜냐하면 Redis 리스트는 실제로는 퀵리스트(quicklist)의 형태이기 때문입니다.
[이미지 업로드에 실패했습니다. ...(image-625c1b-1537973556457 )]
ziplist란 무엇인지 소개하겠습니다. 사실 연속적인 메모리 공간입니다
그림에서 볼 수 있듯이 퀵 리스트는 실제로 압축 리스트와 양방향 포인터로 구성되어 있습니다. 하지만 우리는 연결 리스트에 포인터가 두 개 있다는 것을 알고 있습니다. 이전 실행과 다음 실행은 빠른 목록이며 링크 목록의 한 가지 차이점입니다.
PS: 그러면 redis를 설계할 때 왜 양방향 포인터로 변경했나요? 연결된 리스트처럼 prev와 next 두 개의 포인터를 사용하면 순회도 가능하지만 양방향 포인터는 상대적으로 적은 메모리 공간을 차지한다는 분명한 이점이 있습니다. 큐와 스택/* 队列:First in first out */ //加两个value >rpush keynames key1 key2 2 //计算 >llen keynames 2 >lpop keynames key1 >lpop keynames key2 //rpush会自动过期的 >rpop keynames NULL /* 栈:First in last out */ //同样,加两个元素 >rpush keynames key1 key2 2 >rpop keynames key2 >rpop keynames key1사전 해시Redis의 사전은 자바 언어의 해시맵과도 비슷합니다. 또한 순서가 지정되지 않은 2차원 구조, 즉 배열에 목록을 더한 구조입니다. 이는 redis 사전 및 해시맵과 유사합니다. 그리고 rehash 및 사전 새로 고침 작업과 같은 차이점도 있습니다. Hashmap은 사전이 충분하면 성능이 좋지 않으므로 redis가 변형되어
progressive 접근 방식을 채택합니다. 진보라고? Redis는 모두 다시 로드하지 않고 이전 사전과 새 사전을 저장한 다음 예약된 작업을 사용하여 이전 해시의 데이터를 새 해시로 이동하기 때문에 해시 메모리 공간이 재활용됩니다
사전 배열( 해시) 및 링크 구조:[이미지 업로드 실패...(image-f5660f-1537973556457)]
>hset keynames key1 "test1" 1 >hset keynames key2 "test2" 1 //批量set >hmset keynames key1 "test1" key2 "test2" OK //获取key1的值 >hget keynames key1 test1 //获取hash为keynames的长度 >hlen keynames 2 //获取全部 >hgetall keynames 1) key1 2) test1 3) key2 4) test2set setredis 세트와 Java 언어의 해시 세트 유형은
순서가 없고 고유합니다.
>sadd keynames key1 1 //key1已经加过了,所以返回1 >sadd keynames key1 key2 1 >smembers keynames 1) key2 2) key1 //查询某个key是否存在,相当与contains >sismember keynames key1 1 //相当于count >scard keynames 2 //随意弹出key1 >spop keynames key1Ordered set zSetOrdered set은 Redis에서 더 독특합니다. SortedSet과 HashMap의 조합과 유사합니다. 내부 구현은 점프 목록이라는 데이터 구조입니다. 한편, 순서가 지정된 집합은 집합이므로 각 요소는 고유하며 각 값에 점수를 할당한 다음 이 점수에 따라 정렬할 수 있습니다.
ps: 이러한 이유로 주문한 세트는 팬 정보를 저장하는 데 사용될 수 있으며 값은 팬 ID, 점수는 팔로우 시간
//9.0是score也就是权重 >zadd keyname 9.0 math 1 >zadd keyname 9.2 history 1 //顺序 >zrange keyname 0 -1 1) history 2) math //逆序 >zrevrange keyname 0 -1 1) math 2) history //相当于count() >zcard keyname 2 获取指定key的score >zscore keyname math 9Jump list TODO
위 내용은 Redis 학습 기본 데이터 구조의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!