이 글은 Redis에 대한 관련 지식을 제공하며, 주로 일반적인 데이터 구조에 대한 관련 내용을 소개합니다. 가장 일반적으로 사용되는 5가지, 즉 문자열, 해시, 집합 및 순서가 있습니다. 모든 사람에게 도움이 되기를 바랍니다.
추천 학습: Redis 동영상 튜토리얼
Redis는 Redis에서 데이터에 액세스하는 데 가장 일반적으로 사용되는 5가지 데이터 구조를 제공합니다. String, Hash, list, set, 주문 세트(ZSET).
문자열 형식은 Redis의 가장 기본적인 데이터 구조입니다. 우선, 키는 모두 문자열 유형이고, 기타 여러 데이터 구조는 문자열 유형을 기반으로 구축되므로 문자열 유형은 다른 4가지 데이터 구조 학습의 기반을 마련할 수 있습니다. 문자열 유형의 값은 실제로 문자열(간단한 문자열, 복잡한 문자열(예: JSON, XML)), 숫자(정수, 부동 소수점 숫자) 또는 심지어 이진수(그림, 오디오, 비디오)일 수 있지만 값은 다음과 같습니다. 가장 큰 크기는 512MB를 초과할 수 없습니다.
(Redis는 C로 작성되었고, C에는 되는 문자열이 있지만 여러 가지 고려 사항으로 인해 Redis는 여전히 문자열 형식 자체를 구현합니다.)
키 값 설정
set 명령에는 여러 가지 옵션이 있습니다.
ex 초: 키의 두 번째 수준 만료 시간을 설정합니다.
px 밀리초: 키의 만료 시간을 밀리초로 설정합니다.
nx: 키가 성공적으로 설정되고 추가에 사용되기 전에는 키가 존재하지 않아야 합니다(일반적으로 분산 잠금에 사용됨).
xx: nx와 달리 키를 성공적으로 설정하고 업데이트에 사용하려면 키가 존재해야 합니다.
실행 효과에서 ex 매개변수는 기본적으로 만료 명령과 동일합니다. 특별한 주의가 필요한 또 다른 점은 문자열에 만료 시간이 설정되어 있고 이를 수정하기 위해 set 메서드를 호출하면 해당 만료 시간이 사라진다는 것입니다.
nx와 xx의 실행 효과는 다음과 같습니다
Redis는 set 옵션 외에도 setex 및 setnx 명령도 제공합니다.
setex 키 초 값
setnx 키 값
setex 및 setnx는 ex 및 nx 옵션과 동일한 기능을 갖습니다. 즉, setex는 키에 대한 두 번째 수준 만료 시간을 설정합니다. setnx를 설정할 때 키가 존재하지 않아야 성공적으로 설정할 수 있습니다.
setex 예:
setnx 예:
foo-ex 키가 이미 존재하므로 setnx는 실패하고 반환 결과는 0입니다. foo-ex2 키가 존재하지 않으므로 setnx는 성공하고 반환 결과는 1 입니다.
응용 시나리오가 있습니까? Redis의 단일 스레드 명령 처리 메커니즘으로 인해 여러 클라이언트가 동시에 setnx 키 값을 실행하는 경우 setnx 명령을 예로 들어 보겠습니다. Setnx의 특징은 분산 잠금을 위한 구현 솔루션으로 사용될 수 있습니다. 물론 분산 잠금에는 하나의 명령만 필요한 것은 아닙니다. 주의할 점이 많습니다. Redis 기반의 분산 잠금에 대해서는 나중에 별도의 장을 사용하여 설명하겠습니다.
얻을 키가 존재하지 않으면 nil(비어 있음)을 반환합니다.
한 번에 4개의 키-값 쌍을 설정합니다. mset 명령을 통해
키 a, b, c, d의 값을 일괄로 얻습니다.
일부 키가 존재하지 않는 경우 이면 해당 값은 nil(비어 있음)이고 결과는 전달된 대로입니다. 키를 입력한 순서가 반환됩니다.
Mget과 같은 명령이 없는 경우, n get 명령을 실행하는 데 필요한 구체적인 시간은 다음과 같습니다.
n get 회 = n 네트워크 회 + n 명령 회
mget 사용 후 명령에서 n get 명령 작업을 실행하는 데 필요한 특정 시간은 다음과 같습니다.
n get 시간 = 1 네트워크 시간 + n 명령 시간
Redis는 초당 수만 번의 읽기 및 쓰기 작업을 지원할 수 있지만 이는 Redis 서버의 처리 능력을 의미하며, 명령에는 네트워크 시간도 있습니다. 1밀리초, 명령 시간은 0.1밀리초(초당 10,000개의 명령 처리 기준), 1000개의 get 명령을 실행하는 데 1.1초(10001+10000.1=1100ms), 1 mget 명령에 0.101초( 11+1000 0.1=101ms).
incr 명령은 값을 증가시키는 데 사용됩니다. 반환된 결과는 세 가지 상황으로 구분됩니다.
값이 정수가 아니며 오류가 반환됩니다.
값은 정수이며, 증가시킨 후의 결과를 반환합니다.
키가 존재하지 않습니다. 0 값에 따라 증가하고 반환되는 결과는 1입니다.
incr 명령 외에도 Redis는 decr(자동 감소), incrby(지정된 숫자로 자동 증가), decrby(지정된 숫자로 자동 감소) 및 incrbyfloat(자동 증가)를 제공합니다. 부동 소수점 숫자) 특정 효과를 직접 시도해 보십시오. Append Append Append CommandAppend는 StringStrlen String Length의 끝까지 값을 추가 할 수 있습니다. String Length inturns : 각 중국어 문자는 3 바이트를 차지합니다.
아래 첨자는 0부터 시작합니다.
getrange는 문자열을 가로챕니다.
명령의 시간 복잡도
사용 시나리오
문자열 유형에는 다양한 사용 시나리오가 있습니다.
Redis는 캐시 계층으로, MySQL은 스토리지 계층으로, 요청된 데이터의 대부분은 Redis에서 가져옵니다. Redis는 높은 동시성을 지원하는 특성을 가지고 있으므로 캐싱은 일반적으로 읽기 및 쓰기 속도를 높이고 백엔드 부담을 줄이는 역할을 할 수 있습니다.
Counting
공유 세션
속도 제한
예를 들어, 보안상의 이유로 많은 애플리케이션에서는 사용자가 본인인지 확인하기 위해 로그인할 때마다 휴대폰 인증 코드를 입력하도록 사용자에게 요청합니다. 그러나 SMS 인터페이스에 자주 액세스하는 것을 피하기 위해 사용자가 분당 인증 코드를 받는 빈도는 분당 5회 이하로 제한됩니다. 일부 웹사이트에서는 IP 주소가 1초에 n번 이상 요청되지 않도록 제한하며 유사한 아이디어를 채택할 수 있습니다.Hash
Java는 HashMap을 제공하고 Redis도 비슷한 데이터 구조를 가지고 있는데, 바로 해시형입니다. 하지만 해시 유형의 매핑 관계를 필드-값이라고 합니다. 여기서 값은 키에 해당하는 값이 아니라 필드에 해당하는 값을 의미합니다. 연산 명령기본적으로 해시 연산 명령은 문자열 연산 명령과 매우 유사합니다. 많은 명령이 문자열 유형 명령 앞에 문자 h를 추가하는데, 이는 해시 유형이 연산된다는 의미와 동시에 시간이면 작업할 필드의 값을 지정해야 합니다.
hset 설정값hset 사용자:1 이름 lijin설정이 성공하면 1을 반환하고, 그렇지 않으면 0을 반환합니다. 또한 Redis는 hsetnx 명령을 제공합니다. 해당 관계는 범위가 키에서 필드로 변경된다는 점을 제외하면 set 및 setnx 명령과 동일합니다.
hget user:1 name
키나 필드가 없으면 nil이 반환됩니다.
hdel은 하나 이상의 필드를 삭제하며 반환 결과는 성공적으로 삭제된 필드의 수입니다.
만약 존재하지 않으면 1을 반환합니다. 0을 반환합니다.
지정된 해시 키가 있는 모든 필드를 반환합니다.
hgetall을 사용할 때 해시 요소의 개수가 상대적으로 많으면 Redis를 차단할 가능성이 있습니다. 필드의 일부만 가져와야 하는 경우 hmget을 사용할 수 있습니다. 모든 필드 값을 가져와야 하는 경우 hscan 명령을 사용할 수 있습니다. 이 명령은 이후 장에서 hscan을 점진적으로 탐색합니다. .
hincrby 및 hincrbyfloat를 추가하지만 해당 범위는 지정됩니다.
해시형 연산 명령에서 hdel, hmget, hmset의 시간 복잡도는 명령의 필드 수와 관련이 있습니다. O( k ), hkeys, hgetall, hvals는 저장된 총 필드 수 O(N)과 관련됩니다. 나머지 명령의 시간 복잡도는 O(1)입니다.
이전 작업에서 볼 수 있듯이 String과 Hash의 작업은 매우 유사하므로 저장용 해시를 생성해야 하는 이유는 무엇입니까?
해시 유형은 데이터베이스의 테이블 레코드에 있는 사용자가
id | name | age |
---|---|---|
1인 경우 비교할 수 있습니다. | lijin | 18 |
2 | msb | 20 |
1. 문자열 유형을 사용하려면
하나씩 삽입하고 검색해야 합니다.
set user:1:name lijin;
set user:1:age 18;
set user:2:name msb;
set user:2:age 20;
장점: 간단하고 직관적이며 각각 키는 값에 해당합니다
단점: 키가 너무 많고 메모리를 많이 차지하며 사용자 정보가 너무 분산되어 프로덕션 환경에서 사용되지 않습니다
2. 객체를 직렬화하여 redis에 저장합니다
set user:1 serialize( userInfo);
장점: 간단한 프로그래밍, 직렬화가 사용되는 경우 높은 메모리 사용량
단점: 직렬화 및 역직렬화에는 특정 오버헤드가 있으며, 속성을 업데이트할 때 모든 userInfo를 제거해야 합니다. 업데이트 후 redis
로 직렬화합니다. 해시 유형을 사용하세요
hmset user:1 name lijin age 18
hmset user:2 name msb age 20
장점: 간단하고 직관적입니다. 메모리 소모를 줄일 수 있습니다
단점: 내부 인코딩 형식을 제어하기 위해 부적절한 형식은 더 많은 메모리를 소모합니다
list(list) 유형은 여러 개의 정렬된 문자열을 저장하는 데 사용됩니다. 요소, b, c, c 및 b는 왼쪽에서 오른쪽으로 순서가 지정된 목록을 형성합니다. 목록의 각 문자열을 요소라고 합니다. 목록은 최대 (2^32-1)개의 요소(4294967295)를 저장할 수 있습니다.
Redis에서는 목록의 양쪽 끝을 삽입(푸시) 및 팝(팝)할 수 있고, 지정된 범위의 요소 목록을 가져오고, 지정된 인덱스 첨자가 있는 요소를 가져오는 등의 작업도 가능합니다. 리스트는 스택과 큐 역할을 할 수 있고 실제 개발에서 많은 응용 시나리오를 가질 수 있는 비교적 유연한 데이터 구조입니다.
목록 유형에는 두 가지 특징이 있습니다.
첫째, 목록의 요소는 순서가 지정됩니다. 즉, 색인 첨자를 통해 특정 범위의 요소 또는 요소 목록을 얻을 수 있습니다.
둘째, 목록의 요소는 반복될 수 있습니다.
key start end
색인 아래 첨자 기능: 왼쪽에서 오른쪽으로 0~N-1
lrange 0 -1 명령 목록의 모든 요소를 왼쪽에서 오른쪽으로 가져옵니다
이 세 가지 반환 결과는 명령이 완료된 후 현재 목록의 길이, 즉 목록에 포함된 요소의 수입니다. 동시에 rpush와 lpush는 모두 여러 삽입을 지원합니다. 동시에 요소.
r
팝업 후 해당 요소는 사라집니다.
rpop은 목록의 맨 오른쪽에 d 요소를 팝업합니다.
lrem 명령은 목록에서 값과 동일한 요소를 찾아 삭제합니다. 개수에 따라 세 가지 상황으로 구분됩니다. 왼쪽부터
count>0. 오른쪽으로 최대 개수의 요소를 삭제합니다.
count
count=0, 모두 삭제하세요.
반환 값은 실제로 삭제된 요소의 수입니다.
예를 들어 목록의 0번째부터 첫 번째 요소를 유지하려는 경우
ls
l
blpop 및 brpop은 lpop 및 rpop의 버전도 차단합니다. , 또한 여러 목록 유형을 지원하고 차단 시간(초)도 지원합니다. 차단 시간이 0이면 계속 차단된다는 의미입니다. brpop을 예로 들어보겠습니다.
클라이언트가 차단되었습니다(요소가 없으면 차단되므로)
클라이언트는 항상 차단됩니다. 이때 다른 클라이언트 B에서
A 클라이언트를 실행하고
을 출력합니다. 참고: brpop 뒤에 키가 여러 개 있으면 brpop은 키가 있으면 왼쪽에서 오른쪽으로 키를 순회합니다. , 요소를 팝하면 클라이언트가 즉시 반환됩니다.
목록 유형은 다음과 같이 사용할 수 있습니다.
메시지 대기열, Redis lpush+brpop 명령 조합은 차단 대기열을 실현할 수 있으며 생산자 클라이언트는 lrpush를 사용하여 목록 왼쪽의 요소를 삽입합니다. 소비자 클라이언트 brpop 명령을 사용하여 목록 끝에 있는 요소를 차단 방식으로 "잡아" 여러 클라이언트가 로드 밸런싱과 높은 소비 가용성을 보장합니다.
기사 목록
각 사용자는 자신만의 기사 목록을 가지고 있으며 이제 기사 목록을 페이지에 표시해야 합니다. 이때 리스트 사용을 고려해 볼 수 있는 이유는 리스트는 순서가 정해져 있을 뿐만 아니라 인덱스 범위에 따른 요소 획득도 지원하기 때문이다.
다른 데이터 구조 구현
lpush+lpop =Stack(스택)
lpush +rpop =Queue(큐)
lpsh+ ltrim =Capped Collection(제한된 컬렉션)
lpush+brpop=Message Queue(메시지 큐)
세트형도 여러 개의 문자열 요소를 저장할 때 사용하는데 리스트형과 달리 세트에 중복된 요소가 허용되지 않으며, 세트에 포함된 요소가 없음 순서대로 요소를 얻을 수 없습니다. 색인 첨자.
컬렉션에는 최대 2~32제곱(1개의 요소)을 저장할 수 있습니다. 컬렉션 내에서 추가, 삭제, 수정 및 쿼리를 지원하는 것 외에도 Redis는 여러 컬렉션의 교차, 합집합 및 차이 집합을 지원합니다. 컬렉션 유형을 적절하게 사용하면 실제 개발 시 많은 실제 문제를 해결할 수 있습니다.
여러 요소를 추가할 수 있으며, 반환 결과는 성공적으로 추가된 요소의 수입니다.
여러 요소를 삭제할 수 있으며, 반환 결과는 다음과 같습니다. 성공적으로 삭제된 요소 수
주어진 요소 요소가 집합에 있으면 1을 반환하고 그렇지 않으면 0을 반환
숫자를 지정하지 않으면 기본값은 1
입니다.숫자를 지정할 수도 있습니다. 지정하지 않으면 기본값은 1입니다. 팝핑 중이므로 spop 명령이 실행된 후에는 컬렉션에서 요소가 삭제됩니다. srandmember는 그렇지 않습니다.
반환된 결과는 순서가 없습니다
이제 두 세트가 있습니다. set1과 set2입니다
sinterstore destination key [key ...] suionstore destination key [key ...] sdiffstore destination key [key ...]复制代码
요소가 많을 때 세트 간 작업에 시간이 더 많이 걸리므로 Redis는 위의 세 가지 명령(원래 명령 + 저장)을 제공하여 세트 간 교집합, 합집합 및 차이의 결과를 대상 키에 저장합니다. 예:
컬렉션 유형의 일반적인 사용 시나리오는 태그입니다. 예를 들어, 한 사용자는 엔터테인먼트와 스포츠에 관심이 있고 다른 사용자는 역사와 뉴스에 관심이 있을 수 있습니다. 이 데이터를 통해 우리는 동일한 태그를 좋아하는 사람들과 사용자들이 공통적으로 좋아하는 태그를 얻을 수 있습니다. 이 데이터는 사용자 경험과 사용자 접착력을 높이는 데 중요합니다.
예를 들어, 전자상거래 웹사이트는 다양한 라벨을 가진 사용자에게 다양한 유형의 추천을 제공합니다. 예를 들어, 디지털 제품에 더 관심이 있는 사람들은 일반적으로 다양한 페이지나 이메일을 통해 최신 디지털 제품을 추천합니다. 더 많은 혜택을 누리세요.
또한 컬렉션은 복권 활동, 소셜 그래프 등과 같은 활동에 대해 난수를 생성할 수도 있습니다.
Ordered Set은 해시, 리스트, Set에 비해 조금 생소하지만 Ordered Set이라고 하기 때문에 반드시 Set과 연관되어 있어야 하고 Set을 유지하므로 Set은 중복된 멤버를 가질 수 없습니다. , 그러나 차이점은 순서가 지정된 세트의 요소를 정렬할 수 있다는 것입니다. 그러나 정렬 기준으로 색인 첨자를 사용하는 목록과 달리 각 요소에 대한 점수를 정렬 기준으로 설정합니다.
순서화된 세트의 요소는 반복될 수 없지만 점수는 반복될 수 있습니다. 마찬가지로 같은 반에 있는 동급생의 학생 수는 반복될 수 없지만 시험 점수는 동일할 수 있습니다.
정렬 집합은 지정된 점수 및 요소 범위 쿼리 가져오기, 멤버 순위 계산 등과 같은 기능을 제공합니다. 정렬 집합을 올바르게 사용하면 실제 개발에서 많은 문제를 해결하는 데 도움이 될 수 있습니다.
반환 결과는 성공적으로 추가된 멤버의 수를 나타냅니다.
참고:
zadd 명령에는 nx, xx, ch, incr 네 가지 옵션도 있습니다. 네 가지 옵션
nx: 추가를 위해 성공적으로 설정되려면 멤버가 존재하지 않아야 합니다.
xx: 성공적으로 설정하고 업데이트에 사용하려면 먼저 구성원이 있어야 합니다.
ch: 이 작업 이후에 변경된 순서 집합의 요소 수와 점수를 반환합니다.
incr: 점수를 높입니다. 이는 나중에 소개되는 아연rby
멤버가 존재하지 않으면 nil을 반환합니다.
zrank是从分数从低到高返回排名
zrevrank反之
很明显,排名从0开始计算。
允许一次删除多个成员。
返回结果为成功删除的个数。
有序集合是按照分值排名的,zrange是从低到高返回,zrevrange反之。如果加上 withscores选项,同时会返回成员的分数
zrangebyscore key min max [withscores] [limit offset count] zrevrangebyscore key max min [withscores][limit offset count]复制代码
其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之。例如下面操作从低到高返回200到221分的成员,withscores选项会同时返回每个成员的分数。
同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大:
zcount key min max
zremrangebyrank key start end
zremrangebyscore key min max
zinterstore
这个命令参数较多,下面分别进行说明
destination:交集计算结果保存到这个键。
numkeys:需要做交集计算键的个数。
key [key ...]:需要做交集计算的键。
weights weight [weight ...]:每个键的权重,在做交集计算时,每个键中的每个member 会将自己分数乘以这个权重,每个键的权重默认是1。
aggregate sum/ min |max:计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum。
不太好理解,我们用一个例子来说明。(算平均分)
该命令的所有参数和zinterstore是一致的,只不过是做并集计算,大家可以自行实验。
有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
推荐学习:Redis视频教程
위 내용은 Redis에서 일반적으로 사용되는 데이터 구조(구성 및 공유)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!