Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.

青灯夜游
풀어 주다: 2022-01-29 08:00:38
앞으로
2243명이 탐색했습니다.

이 글은 Redis 데이터 유형의 문자열을 이해하고 문자열 데이터 유형의 저장 원리에 대해 이야기하는 데 도움이 되기를 바랍니다.

Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.

Redis는 업무에서 자주 사용되는 미들웨어입니다. 풍부한 데이터 구조를 지원하고 매우 강력한 읽기 및 쓰기 성능을 가지며 tps는 100,000+에 도달할 수 있습니다.

오늘의 글은 가장 많이 사용되는 자료구조 중 하나인 String 타입을 분석하고 요약한 것입니다. 본 글은 redis5.0을 기준으로 분석되었습니다. [관련 권장사항: Redis 동영상 튜토리얼]

1. 기본 사용법

set key value [EX seconds] [PX milliseconds] [NX|XX]
로그인 후 복사

1. set은 구문, key는 지정된 이름, value는 저장해야 하는 값입니다

2. 만료 초, PX 만료 시간을 밀리초 단위로 지정합니다

3. NX: 키가 없을 때만 설정이 성공합니다. 4. XX: 키가 있을 때만 설정이 성공합니다. 요약: 5.0에서는 다음과 같은 설정 명령을 지원합니다. 만료 시간 및 존재하지 않음을 지정합니다. 즉, 하나의 명령을 통해 분산 잠금 기능을 실현할 수 있습니다. 이전 버전에서는 키 설정과 만료 시간 설정을 두 개의 명령으로 나누어야 했습니다. 원자성을 보장하는 것이 더 어렵습니다.

2. 사용 시나리오

1. 핫스팟 데이터 캐시, 분산 세션2. Setnx 분산 잠금

3.Incr 전역 ID

5 , < code>현재 제한 증가分布式锁

3、incr 计数器

4、Incr 全局id

5、Incr 限流

6、bit 操作,位图功能,在线用户统计 0/1标记

三、支持存储的数据类型

整型,字符型,float(单浮点型)

四、不同的编码类型

Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.

Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.

五、String存储原理

在Redis中,数据存储在一个RedisObject类中

typedef struct redisObject {    
//这个类型可以是string,也可以是hash,zset等等
unsigned type:4;    
unsigned encoding:4;    
//记录lru,lfu淘汰算法依赖的访问时间和访问频率    
unsigned lru:LRU_BITS; 
/* LRU time (relative to global lru_clock) or                            * LFU data (least significant 8 bits frequency                            * and most significant 16 bits access time). */
//引用计数器    
int refcount;    
//指向真实数据结构对象    
void *ptr;
} robj;
로그인 후 복사

对于String,Redis自定义了一种简单动态字符串的数据结构来存储字符串数。

源码实现:多种数据结构,分别表示可以存储不同长度的字符串。

Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.

len:代表已经使用的长度

alloc:分配的总内存大小

flags:代表存储类型

buf[]:实际的数据

六、三种编码存储区别

1、embstr的RedisObject,SDS内存在一块,只要创建时分配一次内存,销毁时释放一次内存,查找方便

2、raw则RedisObject,SDS内存不在一块,需要创建时分配两次内存,销毁时释放两次内存

3、embstr的结构,决定了他需要增加长度时,RedisObject,SDS都需要重新分配内存。因此embstr编码的数据是不能修改的,只读的

七、int,embstr编码什么时候转换成raw

1、int类型的数据不再是int类型,转成raw

2、长度大于2^63-1转成embstr

3、embstr字符超过44字节,转成raw

八、SDS数据结构的优点

1、二进制安全的 可以存储图片 整形,浮点型

2、String 的三种编码,充分利用内存,提高内存利用率

  • int 存储8个字节长整形 long ,2^63-1
  • Embstr embstr格式的SDS simple Dynamic String 内存空间是连续的,只读的,只要执行修改就会转成raw
  • Raw,SDS,存储大于44个字节的字符串

3、不用担心内存溢出,sds具备自动扩容能力

4、获取字符串长度时间复杂度O(1),存储了len属性

5、通过空间预分配惰性空间释放防止多次分配内存

6、判断是否结束使用len属性,可以包含'',操作字符串。

九、为什么不用c中的字符数组?

1、需要预先分配内存,可能内存溢出

2、获取长度需要遍历数组,时间复杂度O(n)

3、字符数组长度变化,需要内存重分配

4、c的字符数组中,''代表判断结束。二进制数据存储不安全

6. 비트 연산, 비트맵 기능, 온라인 사용자 통계 0/1 표시 🎜

3. 지원되는 저장 데이터 유형 🎜 🎜정수 유형, 문자 유형, 부동소수점(단일 부동 소수점 유형) 🎜

🎜4. 다양한 인코딩 유형🎜🎜🎜Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.🎜🎜 Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.🎜

🎜5. 문자열 저장 원리🎜🎜🎜Redis에서는 데이터가 RedisObject 클래스에 저장됩니다.🎜
//仅仅设置长度,没有真正清除数据
void sdsclear(sds s) {    
//单纯设置长度为0    
sdssetlen(s, 0);    
//第一个字符设置为结束符    
s[0] = &#39;<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">sds sdsRemoveFreeSpace(sds s) 
{
struct sdshdr *sh;    
sh = (void*) (s-(sizeof(struct sdshdr)));    
// 进行内存重分配,让 buf 的长度仅仅足够保存字符串内容 
sh = zrealloc(sh, sizeof(struct sdshdr)+sh->len+1);    
// 空余空间为 0    
sh->free = 0;    
return sh->buf;
}
로그인 후 복사
로그인 후 복사

'; }🎜문자열의 경우 Redis는 문자 수를 저장하기 위해 간단한 동적 문자열 데이터 구조를 사용자 정의합니다. 🎜🎜소스 코드 구현: 각각 저장 가능한 다양한 길이의 문자열을 나타내는 여러 데이터 구조. 🎜🎜Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.🎜🎜< img src alt="" title="클릭하고 드래그하여 이동" loading="lazy" class="medium-zoom-image"/>len: 사용된 길이를 나타냅니다🎜🎜alloc: 할당된 총 메모리 크기🎜🎜 플래그: 저장 유형을 나타냅니다 🎜🎜buf[]: 실제 데이터 🎜

6. 세 가지 유형의 인코딩 저장 차이점 🎜🎜1 embstr의 RedisObject 및 SDS 메모리는 한 조각에 있습니다. 생성되면 메모리를 한 번 할당하고, 소멸되면 메모리를 한 번 해제하여 찾기 쉽습니다🎜🎜2. Raw는 RedisObject이고 SDS 메모리는 같은 위치에 있지 않습니다. 생성되어야 하며, 메모리를 두 번 할당하고, 파괴되면 메모리를 두 번 해제🎜🎜3합니다. embstr의 구조는 길이를 늘려야 할 때 RedisObject와 SDS는 메모리를 재할당해야 합니다. 따라서 embstr로 인코딩된 데이터는 수정할 수 없으며 읽기 전용입니다. 🎜

🎜7. int 및 embstr 인코딩은 언제 raw로 변환되나요? ^63-1 embstr 문자가 44바이트를 초과하는 경우 raw로 변환합니다. 🎜

🎜8. SDS 데이터 구조의 장점🎜🎜🎜1. 바이너리 금고는 이미지 형성, 부동 소수점 🎜🎜2 및 문자열, 메모리를 최대한 활용하고 메모리 활용도 향상🎜
  • int 저장 공간 8바이트 정수 정수, 2^63-1
  • Embstr< /code> embstr 형식의 SDS 단순 동적 문자열입니다. 메모리 공간은 수정이 수행되는 한 읽기 전용입니다.</li><li> <code>Raw , SDS는 44바이트보다 큰 문자열을 저장합니다.
🎜3. 메모리 오버플로에 대해 걱정하지 마세요. sds에는 자동 확장 기능이 있습니다🎜🎜4. 문자열 길이를 구하는 방법은 O(1)이고 len 속성이 저장됩니다🎜🎜5. 공간 사전 할당지연 공간 해제를 통해 여러 개가 저장되는 것을 방지합니다. 메모리 할당🎜🎜6. '을 포함할 수 있는 len 속성을 사용하여 종료할지 여부를 결정합니다.

十、关于内存预分配特性

Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.

通过源码分析,扩容策略是字符串在长度小于 SDS_MAX_PREALLOC 之前,扩容空间采用加倍策略,也就是保留 100% 的冗余空间。当长度超过 SDS_MAX_PREALLOC 之后,为了避免加倍后的冗余空间过大而导致浪费,每次扩容只会多分配 SDS_MAX_PREALLOC大小的冗余空间。

十一、关于惰性空间释放

惰性空间释放用于优化 SDS 的字符串缩短操作:当 SDS 的 API 需要缩短 SDS 保存的字符串时, 程序并不立即使用内存重分配来回收缩短后多出来的字节, 而是使用 free 属性将这些字节的数量记录起来,并等待将来使用。

//仅仅设置长度,没有真正清除数据
void sdsclear(sds s) {    
//单纯设置长度为0    
sdssetlen(s, 0);    
//第一个字符设置为结束符    
s[0] = &#39;\0&#39;;
}
로그인 후 복사

真正的清除空间

sds sdsRemoveFreeSpace(sds s) 
{
struct sdshdr *sh;    
sh = (void*) (s-(sizeof(struct sdshdr)));    
// 进行内存重分配,让 buf 的长度仅仅足够保存字符串内容 
sh = zrealloc(sh, sizeof(struct sdshdr)+sh->len+1);    
// 空余空间为 0    
sh->free = 0;    
return sh->buf;
}
로그인 후 복사

以上便是关于string的知识点记录,string的设计很多地方都非常巧妙,比如不同的结构体存储不同长度的字符串,不同编码类型存储不同长度的字符串,

空间预分配,空间惰性释放等,从存储结构,编码类型,内存分配策略和回收策略,作者都从性能方面做了非常多的考量设计,可想而知这也是redis为什么性能极高的原因,工作中也要学习这种追求极致性能的优良风格和设计风格。

更多编程相关知识,请访问:编程入门!!

위 내용은 Redis 데이터 유형 학습: 문자열 원리에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!