Table of Contents
Integer set
Jump list
Compressed List
Home Database Redis What is the basic data structure of Redis?

What is the basic data structure of Redis?

May 27, 2023 pm 04:02 PM
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;
Copy after login

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))
Copy after login

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;
Copy after login

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;
Copy after login

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 of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

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

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1266
29
C# Tutorial
1239
24
How to build the redis cluster mode How to build the redis cluster mode Apr 10, 2025 pm 10:15 PM

Redis cluster mode deploys Redis instances to multiple servers through sharding, improving scalability and availability. The construction steps are as follows: Create odd Redis instances with different ports; Create 3 sentinel instances, monitor Redis instances and failover; configure sentinel configuration files, add monitoring Redis instance information and failover settings; configure Redis instance configuration files, enable cluster mode and specify the cluster information file path; create nodes.conf file, containing information of each Redis instance; start the cluster, execute the create command to create a cluster and specify the number of replicas; log in to the cluster to execute the CLUSTER INFO command to verify the cluster status; make

How to clear redis data How to clear redis data Apr 10, 2025 pm 10:06 PM

How to clear Redis data: Use the FLUSHALL command to clear all key values. Use the FLUSHDB command to clear the key value of the currently selected database. Use SELECT to switch databases, and then use FLUSHDB to clear multiple databases. Use the DEL command to delete a specific key. Use the redis-cli tool to clear the data.

How to read redis queue How to read redis queue Apr 10, 2025 pm 10:12 PM

To read a queue from Redis, you need to get the queue name, read the elements using the LPOP command, and process the empty queue. The specific steps are as follows: Get the queue name: name it with the prefix of "queue:" such as "queue:my-queue". Use the LPOP command: Eject the element from the head of the queue and return its value, such as LPOP queue:my-queue. Processing empty queues: If the queue is empty, LPOP returns nil, and you can check whether the queue exists before reading the element.

How to configure Lua script execution time in centos redis How to configure Lua script execution time in centos redis Apr 14, 2025 pm 02:12 PM

On CentOS systems, you can limit the execution time of Lua scripts by modifying Redis configuration files or using Redis commands to prevent malicious scripts from consuming too much resources. Method 1: Modify the Redis configuration file and locate the Redis configuration file: The Redis configuration file is usually located in /etc/redis/redis.conf. Edit configuration file: Open the configuration file using a text editor (such as vi or nano): sudovi/etc/redis/redis.conf Set the Lua script execution time limit: Add or modify the following lines in the configuration file to set the maximum execution time of the Lua script (unit: milliseconds)

How to use the redis command line How to use the redis command line Apr 10, 2025 pm 10:18 PM

Use the Redis command line tool (redis-cli) to manage and operate Redis through the following steps: Connect to the server, specify the address and port. Send commands to the server using the command name and parameters. Use the HELP command to view help information for a specific command. Use the QUIT command to exit the command line tool.

How to implement redis counter How to implement redis counter Apr 10, 2025 pm 10:21 PM

Redis counter is a mechanism that uses Redis key-value pair storage to implement counting operations, including the following steps: creating counter keys, increasing counts, decreasing counts, resetting counts, and obtaining counts. The advantages of Redis counters include fast speed, high concurrency, durability and simplicity and ease of use. It can be used in scenarios such as user access counting, real-time metric tracking, game scores and rankings, and order processing counting.

How to set the redis expiration policy How to set the redis expiration policy Apr 10, 2025 pm 10:03 PM

There are two types of Redis data expiration strategies: periodic deletion: periodic scan to delete the expired key, which can be set through expired-time-cap-remove-count and expired-time-cap-remove-delay parameters. Lazy Deletion: Check for deletion expired keys only when keys are read or written. They can be set through lazyfree-lazy-eviction, lazyfree-lazy-expire, lazyfree-lazy-user-del parameters.

How to optimize the performance of debian readdir How to optimize the performance of debian readdir Apr 13, 2025 am 08:48 AM

In Debian systems, readdir system calls are used to read directory contents. If its performance is not good, try the following optimization strategy: Simplify the number of directory files: Split large directories into multiple small directories as much as possible, reducing the number of items processed per readdir call. Enable directory content caching: build a cache mechanism, update the cache regularly or when directory content changes, and reduce frequent calls to readdir. Memory caches (such as Memcached or Redis) or local caches (such as files or databases) can be considered. Adopt efficient data structure: If you implement directory traversal by yourself, select more efficient data structures (such as hash tables instead of linear search) to store and access directory information

See all articles