search
HomeDatabaseRedisWhat is the basic data structure of Redis?

Integer set

If a set contains only a few integer elements, Redis will use the integer set intset. First look at the data structure of intset:

typedef struct intset {
    // 编码方式
    uint32_t encoding;
    // 集合包含的元素数量
    uint32_t length;
    // 保存元素的数组
    int8_t contents[];
} intset;

In fact, the data structure of intset is relatively easy to understand. A data storage element, length stores the number of elements, which is the size of contents, and encoding is the encoding method used to store data.

We can know from the code that the encoding type of encoding includes:

#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))

In fact, we can see it. The type of Redis encoding refers to the size of the data. As an in-memory database, this design is adopted to save memory.

Since there are three data structures from small to large, use small data structures as much as possible to save memory when inserting data. If the inserted data is larger than the original data structure, expansion will be triggered.

There are three steps for expansion:

  1. According to the type of the new element, modify the data type of the entire array and reallocate the space

  2. Convert the original data to the new data type, re-place it where it should be, and preserve the order

  3. Then insert the new element

Integer collections do not support downgrade operations. Once upgraded, they cannot be downgraded.

Jump list

The skip list is a type of linked list, a data structure that uses space to exchange time. The skip list supports O(logN) average search and worst-case O(N) complexity search.

The skip list is composed of a zskiplist and multiple zskiplistNode. Let’s take a look at their structure first:

/* ZSETs use a specialized version of Skiplists *//*
 * 跳跃表节点
 */

typedef struct zskiplistNode {
    // 成员对象
    robj *obj;
    // 分值
    double score;
    // 后退指针
    struct zskiplistNode *backward;
    // 层
    struct zskiplistLevel {
        // 前进指针
        struct zskiplistNode *forward;
        // 跨度
        unsigned int span;
    } level[];

    } zskiplistNode;
        
/*
 * 跳跃表
 */

typedef struct zskiplist {
    // 表头节点和表尾节点
    struct zskiplistNode *header, *tail;
    // 表中节点的数量
    unsigned long length;
    // 表中层数最大的节点的层数
    int level;

} zskiplist;

So based on this code we can draw the following structure diagram:

What is the basic data structure of Redis?

In fact, the jump table is a utilization space The time-changing data structure uses level as the index of the linked list.

Someone asked the author of Redis before why he uses jump tables instead of trees to build indexes? The author's answer is:

  1. Save memory.

  2. When using ZRANGE or ZREVRANGE, it involves a typical linked list operation scenario. The performance of time complexity is similar to that of balanced trees.

  3. The most important point is that the implementation of the jump table is very simple and can reach the O(logN) level.

Compressed List

Compressed Linked List The author of Redis introduces it as a doubly linked list designed to save memory as much as possible.

The data structure given in the comments in the code for a compressed list is as follows:

What is the basic data structure of Redis?

zlbytes represents the data structure used by the entire compressed list The number of memory bytes

zltail specifies the offset of the tail node of the compression list

zllen is the number of entries in the compression list

entry is the node of ziplist

zlend Marks the end of the compressed list

There is also a single pointer in this list:

ZIPLIST_ENTRY_HEAD Head offset of the start node of the list

ZIPLIST_ENTRY_TAIL Head offset of the end node of the list

ZIPLIST_ENTRY_ENDThe offset of the end of the tail node of the list

Look at the structure of an entry again:

/*
 * 保存 ziplist 节点信息的结构
 */

typedef struct zlentry {
    // prevrawlen :前置节点的长度
    // prevrawlensize :编码 prevrawlen 所需的字节大小
    unsigned int prevrawlensize, prevrawlen;
    // len :当前节点值的长度
    // lensize :编码 len 所需的字节大小  
    unsigned int lensize, len;
    // 当前节点 header 的大小
    // 等于 prevrawlensize + lensize
    unsigned int headersize;
    // 当前节点值所使用的编码类型
    unsigned char encoding;
    // 指向当前节点的指针
    unsigned char *p;

} zlentry;

Explain these parameters in turn.

prevrawlen The length of the preceding node, there is an extra size here, which actually records the size of prevrawlen. In order to save memory, Redis does not directly use the default int length, but gradually upgrades it.
Similarly len records the length of the current node, lensize records the length of len.
headersize is the sum of the two sizes mentioned above.
encoding is the data type of this node. Note here that encoding types only include integers and strings.
p Node pointer, no need to explain too much.

One thing to note is that each node saves the length of the previous node. If a node is updated or deleted, the data after this node also needs to be modified. The worst case scenario is that if every Each node is at the zero point that needs to be expanded, which will cause the nodes after this node to modify the size parameter, triggering a chain reaction. At this time, the worst time complexity of compressing the linked list is O(n^2). However, all nodes are at critical values, so the probability can be said to be relatively small.

The above is the detailed content of What is the basic data structure of Redis?. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:亿速云. If there is any infringement, please contact admin@php.cn delete
Redis: Beyond SQL - The NoSQL PerspectiveRedis: Beyond SQL - The NoSQL PerspectiveMay 08, 2025 am 12:25 AM

Redis goes beyond SQL databases because of its high performance and flexibility. 1) Redis achieves extremely fast read and write speed through memory storage. 2) It supports a variety of data structures, such as lists and collections, suitable for complex data processing. 3) Single-threaded model simplifies development, but high concurrency may become a bottleneck.

Redis: A Comparison to Traditional Database ServersRedis: A Comparison to Traditional Database ServersMay 07, 2025 am 12:09 AM

Redis is superior to traditional databases in high concurrency and low latency scenarios, but is not suitable for complex queries and transaction processing. 1.Redis uses memory storage, fast read and write speed, suitable for high concurrency and low latency requirements. 2. Traditional databases are based on disk, support complex queries and transaction processing, and have strong data consistency and persistence. 3. Redis is suitable as a supplement or substitute for traditional databases, but it needs to be selected according to specific business needs.

Redis: Introduction to a Powerful In-Memory Data StoreRedis: Introduction to a Powerful In-Memory Data StoreMay 06, 2025 am 12:08 AM

Redisisahigh-performancein-memorydatastructurestorethatexcelsinspeedandversatility.1)Itsupportsvariousdatastructureslikestrings,lists,andsets.2)Redisisanin-memorydatabasewithpersistenceoptions,ensuringfastperformanceanddatasafety.3)Itoffersatomicoper

Is Redis Primarily a Database?Is Redis Primarily a Database?May 05, 2025 am 12:07 AM

Redis is primarily a database, but it is more than just a database. 1. As a database, Redis supports persistence and is suitable for high-performance needs. 2. As a cache, Redis improves application response speed. 3. As a message broker, Redis supports publish-subscribe mode, suitable for real-time communication.

Redis: Database, Server, or Something Else?Redis: Database, Server, or Something Else?May 04, 2025 am 12:08 AM

Redisisamultifacetedtoolthatservesasadatabase,server,andmore.Itfunctionsasanin-memorydatastructurestore,supportsvariousdatastructures,andcanbeusedasacache,messagebroker,sessionstorage,andfordistributedlocking.

Redis: Unveiling Its Purpose and Key ApplicationsRedis: Unveiling Its Purpose and Key ApplicationsMay 03, 2025 am 12:11 AM

Redisisanopen-source,in-memorydatastructurestoreusedasadatabase,cache,andmessagebroker,excellinginspeedandversatility.Itiswidelyusedforcaching,real-timeanalytics,sessionmanagement,andleaderboardsduetoitssupportforvariousdatastructuresandfastdataacces

Redis: A Guide to Key-Value Data StoresRedis: A Guide to Key-Value Data StoresMay 02, 2025 am 12:10 AM

Redis is an open source memory data structure storage used as a database, cache and message broker, suitable for scenarios where fast response and high concurrency are required. 1.Redis uses memory to store data and provides microsecond read and write speed. 2. It supports a variety of data structures, such as strings, lists, collections, etc. 3. Redis realizes data persistence through RDB and AOF mechanisms. 4. Use single-threaded model and multiplexing technology to handle requests efficiently. 5. Performance optimization strategies include LRU algorithm and cluster mode.

Redis: Caching, Session Management, and MoreRedis: Caching, Session Management, and MoreMay 01, 2025 am 12:03 AM

Redis's functions mainly include cache, session management and other functions: 1) The cache function stores data through memory to improve reading speed, and is suitable for high-frequency access scenarios such as e-commerce websites; 2) The session management function shares session data in a distributed system and automatically cleans it through an expiration time mechanism; 3) Other functions such as publish-subscribe mode, distributed locks and counters, suitable for real-time message push and multi-threaded systems and other scenarios.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools