Redis是一款开源的高性能key-value数据库,广泛应用于各种场景。在Redis中,数据类型(type)和编码(encoding) 是非常重要的概念。本篇博客将详细介绍Redis支持的数据类型以及相应的编码方式和底层实现原理。
要查看Redis某个key的内部编码,可以使用Redis命令OBJECT ENCODING key
。其中,key
是你想要查询的键名。例如,如果你想要查询名为mykey
的键的内部编码,可以执行以下命令:
127.0.0.1:6379> object encoding mykey // 查看某个Redis键值的编码
在 Redis 中,redisObject 是 Redis 中最基本的数据结构之一。redisObject 用于表示 Redis 中的键值对中的值,它可以是字符串、整数、列表、哈希表等任意一种 Redis 数据类型。
redisObject 的定义如下:
typedef struct redisObject { // 类型 unsigned type:4; // 编码方式 unsigned encoding:4; // 引用计数 int refcount; // 指向实际值的指针 void *ptr; } robj;
type:表示 redisObject 的类型。
encoding:表示 redisObject 的编码方式。
refcount:表示当前 redisObject 被引用的次数。
ptr: ptr字段则是一个指针,指向实际的 Redis 对象。
Redis源码encoding取值有如下几种:
#define OBJ_ENCODING_RAW 0 /* Raw representation */ #define OBJ_ENCODING_INT 1 /* Encoded as integer */ #define OBJ_ENCODING_HT 2 /* Encoded as hash table */ #define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */ #define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */ #define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */ #define OBJ_ENCODING_INTSET 6 /* Encoded as intset */ #define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist */ #define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */ #define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
Redis支持五种主要的数据类型:字符串(string)、列表(list)、集合(set)、有序集合(sorted set)和哈希(hash)。每种数据类型都有对应的编码方式。
数据类型与编码方式总览如下:
数据类型 | 编码方式 |
---|---|
字符串 | int、embstr、raw |
哈希表 | ziplist、hashtable |
列表 | ziplist、linkedlist、quicklist |
集合 | intset、hashtable |
有序集合 | ziplist、skiplist |
String ist der grundlegendste Datentyp in Redis und wird normalerweise zum Speichern von Text- oder Binärdaten verwendet. Redis unterstützt zwei Codierungsmethoden:
Wenn in Redis eine Zeichenfolge als Ganzzahl dargestellt werden kann, wird sie in eine Ganzzahl konvertiert und mithilfe der Int-Codierung gespeichert. Die Vorteile der Int-Codierung sind geringer Speicherplatz und hohe Betriebseffizienz. Der Nachteil besteht darin, dass nur Ganzzahlen gespeichert werden können und keine Zeichenfolgenoperationen unterstützt werden.
embstr (embstr-codierte Zeichenfolge): Speichern Sie Zeichenfolgen mit einer Länge von weniger als 44 Bytes. Wenn eine Zeichenfolge relativ kurz ist, kann die Verwendung dieser Codierungsmethode zum Speichern den Speicherverbrauch reduzieren.
raw (rohcodierte Zeichenfolge): Speichern Sie Zeichenfolgen mit einer Länge von mehr als 44 Bytes. Wenn eine Zeichenfolge relativ lang ist, wird diese Codierungsmethode zum Speichern verwendet.
Eine Liste ist eine geordnete Sammlung von Zeichenfolgen, in der Elemente hinzugefügt, geändert und gelöscht werden können. Redis unterstützt drei Codierungsmethoden:
ziplist: Vor der Redis3.2-Version, Wenn die Länge jeder Zeichenfolge in der Liste weniger als 64 Byte beträgt und die Anzahl der Elemente in der Liste weniger als 512 beträgt, , die Listenobjekt Verwenden Sie die Ziplist-Kodierung und in anderen Fällen die Linkedlist-Kodierung. ziplist ist eine kompakte, komprimierte Listenstruktur, die Speicherplatz spart. Gut für kleine Listen.
Linkedlist ist eine Art Datenstruktur, die Listen jeder Größe durch eine verknüpfte Listenstruktur unterstützt. Der Speicherbedarf nimmt jedoch mit zunehmender Länge der Liste zu.
Quicklist: Quicklist wurde in Redis Version 3.2 eingeführt und ist eine aus mehreren Ziplists bestehende Listenstruktur, die nicht nur die Leistung sicherstellen, sondern auch Speicher sparen kann. Geeignet für große Listen.
Eine Sammlung ist eine Reihe ungeordneter Zeichenfolgensammlungen, die das Hinzufügen, Löschen und Abfragen von Elementen unterstützen. Redis unterstützt zwei Codierungsmethoden:
intset: Wenn die Elemente in der Sammlung alle Ganzzahlen sind, verwendet Redis die Intset-Codierung zum Speichern von . Die Vorteile der Intset-Codierung sind geringer Speicherplatz und hohe Betriebseffizienz.
hashtable: Wenn die Elemente in der Sammlung Zeichenfolgen enthalten, speichert Redis sie in der Hashtable-Codierung . Der Vorteil der Hashtable-Codierung besteht darin, dass sie Elemente jeden Typs speichern kann und String-Operationen unterstützt. Der Nachteil besteht darin, dass der Speicherplatz relativ groß und die Betriebseffizienz relativ gering ist.
Ungeordneter Sammlung von Zeichenfolgen wird eine Punktzahl zugewiesen, sodass sie entsprechend der Punktzahl sortiert werden können und einen geordneten Satz bilden. Redis unterstützt zwei Kodierungsmethoden:
ziplist: Speichern Sie mit der Ziplist-Kodierung weniger als 128 Elemente und alle Elementgrößen betragen weniger als 64 Byte. Ziplist ist eine kompakte, komprimierte Listenstruktur, die für kleine geordnete Sammlungen geeignet ist.
skiplist: Skiplist ist eine Skiplist-Struktur, die eine schnelle Abfrage und Sortierung unterstützt. Geeignet für große, geordnete Sammlungen.
Eine Hash-Tabelle ist eine Sammlung von Schlüssel-Wert-Paaren, wobei jedem Schlüssel ein Wert zugeordnet ist. Redis unterstützt zwei Codierungsmethoden:
ziplist: Die Zeichenfolgenlänge aller im Hash-Objekt gespeicherten Schlüsselwerte beträgt weniger als 64 Byte und die Anzahl der Schlüssel-Wert-Paare beträgt weniger als 512 , Redis speichert sie in Ziplist-Kodierung. Die Vorteile der Ziplist-Kodierungsmethode sind geringer Speicherplatz und hohe Betriebseffizienz. Der Nachteil besteht darin, dass schnelle Schlüsselsuchvorgänge nicht unterstützt werden.
Zusätzlich zu den oben genannten Bedingungen verwendet Redis die Hash-Tabellenkodierung zur Speicherung. Der Vorteil der Hashtable-Codierung besteht darin, dass sie schnelle Schlüsselsuchvorgänge unterstützt. Der Nachteil besteht darin, dass der Speicherplatz relativ groß und die Betriebseffizienz relativ gering ist.
Nachdem wir die von Redis unterstützten Datentypen und Codierungsmethoden verstanden haben, werfen wir einen Blick auf die zugrunde liegenden Implementierungsprinzipien.
In Redis verfügt jedes Schlüssel-Wert-Paar über eine Typkennung, die zur Angabe des im Schlüssel-Wert-Paar gespeicherten Datentyps verwendet wird. Wenn wir einen Schlüssel bearbeiten, kodiert Redis das Schlüssel-Wert-Paar basierend auf der aktuellen Kodierung des Schlüssels und der für die Operation erforderlichen Kodierung.
Wenn wir beispielsweise Inhalte an einen String anhängen und die aktuelle Codierung des Strings unformatiert ist, der neue Inhalt jedoch mit der Embstr-Codierung gespeichert werden kann, konvertiert Redis die Codierung des Strings vom rohen forembstr.
Redis verwendet eine Vielzahl klassischer Datenstrukturen, um verschiedene Datentypen zu implementieren, und beschränkt sich nicht nur auf Codierungsmethoden. Beispielsweise werden Redis-Listen und Hash-Tabellen mithilfe verknüpfter Listenstrukturen implementiert. Skip List ist eine effiziente Datenstruktur, die in geordneten Sammlungen verwendet wird.
Diese Datenstrukturen wurden sorgfältig entworfen und optimiert, um den Anwendungsanforderungen in verschiedenen Szenarien gerecht zu werden. Beispielsweise eignet sich die verknüpfte Listenstruktur für Situationen, in denen Elemente häufig hinzugefügt und gelöscht werden müssen, während die Struktur der übersprungenen Liste besser für Sortier- und Suchvorgänge geeignet ist.
Das obige ist der detaillierte Inhalt vonWas sind die Prinzipien und die Verwendung der Redis-Typ- und Kodierungskodierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!