Heim >Datenbank >Redis >Lernen von Redis-Datentypen: Lassen Sie uns über String-Prinzipien sprechen

Lernen von Redis-Datentypen: Lassen Sie uns über String-Prinzipien sprechen

青灯夜游
青灯夜游nach vorne
2022-01-29 08:00:382311Durchsuche

Dieser Artikel wird Ihnen helfen, den String im Redis-Datentyp zu verstehen und über das Speicherprinzip des String-Datentyps zu sprechen.

Lernen von Redis-Datentypen: Lassen Sie uns über String-Prinzipien sprechen

Redis ist eine Middleware, die häufig in der Arbeit verwendet wird. Sie unterstützt umfangreiche Datenstrukturen, verfügt über eine extrem starke Lese- und Schreibleistung und kann 100.000+ TPS erreichen.

Der heutige Artikel analysiert und fasst den String-Typ zusammen, der auch eine der am häufigsten verwendeten Datenstrukturen ist. Dieser Artikel wird basierend auf redis5.0 analysiert. [Verwandte Empfehlungen: Redis-Video-Tutorial

1. Grundlegende Verwendung
set key value [EX seconds] [PX milliseconds] [NX|XX]

1. set ist der angegebene Name, value ist der Wert, der gespeichert werden muss

2 Ablaufzeit Sekunden, PX Geben Sie die Ablaufzeit in Millisekunden an

3. Die Einstellung ist nur erfolgreich, wenn der Schlüssel nicht vorhanden ist. Zusammenfassung: 5.0 unterstützt den Set-Befehl Geben Sie die Ablaufzeit und die Nichtexistenz an, das heißt, die verteilte Sperrfunktion kann über einen Befehl realisiert werden. In früheren Versionen müssen das Festlegen des Schlüssels und das Festlegen der Ablaufzeit in zwei Befehle unterteilt werden es schwieriger, die Atomizität sicherzustellen.

2. Nutzungsszenarien

2. Setnx Distributed lock

4. Incr globale ID

5 code>Incr current limit

6. Bitoperation, Bitmap-Funktion, Online-Benutzerstatistik 0/1 Markierung

3. Unterstützte gespeicherte Datentypen 分布式锁

3、incr 计数器

4、Incr 全局id

5、Incr 限流

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

三、支持存储的数据类型

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

四、不同的编码类型

Lernen von Redis-Datentypen: Lassen Sie uns über String-Prinzipien sprechen

Lernen von Redis-Datentypen: Lassen Sie uns über String-Prinzipien sprechen

五、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自定义了一种简单动态字符串的数据结构来存储字符串数。

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

Lernen von Redis-Datentypen: Lassen Sie uns über String-Prinzipien sprechen

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属性,可以包含'

Das obige ist der detaillierte Inhalt vonLernen von Redis-Datentypen: Lassen Sie uns über String-Prinzipien sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen