이 글은 Redis 데이터 유형의 문자열을 이해하고 문자열 데이터 유형의 저장 원리에 대해 이야기하는 데 도움이 되기를 바랍니다.
Redis는 업무에서 자주 사용되는 미들웨어입니다. 풍부한 데이터 구조를 지원하고 매우 강력한 읽기 및 쓰기 성능을 가지며 tps는 100,000+에 도달할 수 있습니다.
오늘의 글은 가장 많이 사용되는 자료구조 중 하나인 String 타입을 분석하고 요약한 것입니다. 본 글은 redis5.0을 기준으로 분석되었습니다. [관련 권장사항: Redis 동영상 튜토리얼]
set key value [EX seconds] [PX milliseconds] [NX|XX]
1. set은 구문, key는 지정된 이름, value는 저장해야 하는 값입니다
2. 만료 초, PX 만료 시간을 밀리초 단위로 지정합니다
3. NX: 키가 없을 때만 설정이 성공합니다. 4. XX: 키가 있을 때만 설정이 성공합니다. 요약: 5.0에서는 다음과 같은 설정 명령을 지원합니다. 만료 시간 및 존재하지 않음을 지정합니다. 즉, 하나의 명령을 통해 분산 잠금 기능을 실현할 수 있습니다. 이전 버전에서는 키 설정과 만료 시간 설정을 두 개의 명령으로 나누어야 했습니다. 원자성을 보장하는 것이 더 어렵습니다.
2. 사용 시나리오분산 잠금
3.Incr 전역 ID
5 , < code>현재 제한 증가分布式锁
3、incr 计数器
4、Incr 全局id
5、Incr 限流
6、bit 操作,位图功能,在线用户统计 0/1标记
整型,字符型,float(单浮点型)
在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自定义了一种简单动态字符串的数据结构来存储字符串数。
源码实现:多种数据结构,分别表示可以存储不同长度的字符串。
len:代表已经使用的长度
alloc:分配的总内存大小
flags:代表存储类型
buf[]:实际的数据
1、embstr的RedisObject,SDS内存在一块,只要创建时分配一次内存
,销毁时释放一次内存
,查找方便
2、raw则RedisObject,SDS内存不在一块,需要创建时分配两次内存
,销毁时释放两次内存
3、embstr的结构,决定了他需要增加长度时,RedisObject,SDS都需要重新分配内存。因此embstr编码的数据是不能修改的,只读的
。
1、int类型的数据不再是int类型,转成raw
2、长度大于2^63-1转成embstr
3、embstr字符超过44字节,转成raw
1、二进制安全的
可以存储图片 整形,浮点型
2、String 的三种编码,充分利用内存,提高内存利用率
int
存储8个字节长整形 long ,2^63-1Embstr
embstr格式的SDS simple Dynamic String 内存空间是连续的,只读的,只要执行修改就会转成rawRaw
,SDS,存储大于44个字节的字符串3、不用担心内存溢出,sds具备自动扩容能力
4、获取字符串长度时间复杂度O(1)
,存储了len属性
5、通过空间预分配
和惰性空间释放
防止多次分配内存
6、判断是否结束使用len属性,可以包含'