Home Database Redis Why is redis said to be single-threaded?

Why is redis said to be single-threaded?

Jan 11, 2021 am 09:31 AM
redis single thread

Why is redis said to be single-threaded?

Redis is the remote dictionary service. It is an open source log-type Key-Value database written in ANSI C language, supports the network, can be based on memory and can be persisted, and provides multiple language API.

(Learning video sharing: redis video tutorial)

File event processor

Redis has developed a network event processor based on the Reactor mode. This processing The handler is called a file event handler. Its structure is composed of 4 parts: multiple sockets, IO multiplexer, file event dispatcher, and event processor. Because the consumption of the file event dispatcher queue is single-threaded, Redis is called a single-threaded model.

Why is redis said to be single-threaded?

Message processing process

The file event processor uses I/O multiplexing (multiplexing) procedures to listen to multiple sockets at the same time, and Different event handlers are associated with the socket based on the task it is currently performing.

When the monitored socket is ready to perform operations such as connection response (accept), read (read), write (write), close (close), etc., the file event corresponding to the operation is will occur, then the file event handler will call the event handler previously associated with the socket to handle these events.

Although multiple file events may occur concurrently, the I/O multiplexer will always push all sockets that generate events into a queue, and then pass through this queue to Send sockets to the file event dispatcher sequentially, synchronously, one socket at a time: when the event generated by the previous socket is processed (the socket is the object of the event) The associated event handler is executed), and the I/O multiplexer will continue to send the next socket to the file event dispatcher.

I/O multiplexing program implementation

All functions of Redis's I/O multiplexing program are packaged by selecting, epoll, evport and kqueue. It is implemented by multiplexing function library. Each I/O multiplexing function library corresponds to a separate file in the Redis source code, such as ae_select.c, ae_epoll.c, ae_kqueue.c, etc.

Because Redis implements the same API for each I/O multiplexing function library, the underlying implementation of the I/O multiplexing program is interchangeable, as shown in the figure below.

Why is redis said to be single-threaded?

For a detailed explanation of epoll, you can click to view and thoroughly understand the principle of efficient operation of epoll

The role of Redis in I/O multiplexing programs The #include macro is used to define corresponding rules in the implementation source code. The program will automatically select the best-performing I/O multiplexing function library in the system during compilation as the underlying implementation of the Redis I/O multiplexing program. :

/* Include the best multiplexing layer supported by this system.
 * The following should be ordered by performances, descending. */
#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
    #ifdef HAVE_EPOLL
    #include "ae_epoll.c"
    #else
        #ifdef HAVE_KQUEUE
        #include "ae_kqueue.c"
        #else
        #include "ae_select.c"
        #endif
    #endif
#endif
Copy after login

Types of file events

The I/O multiplexer can listen to the ae.h/AE_READABLE event and ae.h/AE_WRITABLE event of multiple sockets. The correspondence between class events and socket operations is as follows:

When the socket becomes readable (the client performs a write operation on the socket, or performs a close operation), or there is a new When an acceptable socket appears (the client performs a connect operation on the server's listening socket), the socket generates an AE_READABLE event.

When the socket becomes writable (the client performs a read operation on the socket), the socket generates the AE_WRITABLE event. The I/O multiplexer allows the server to listen to the AE_READABLE event and the AE_WRITABLE event of the socket at the same time. If a socket generates both events at the same time, the file event dispatcher will prioritize the AE_READABLE event and wait until the AE_READABLE event is processed. After that, handle the AE_WRITABLE event. This means that if a socket is both readable and writable, the server will read from the socket first and then write to the socket.

File event processor

Redis has written multiple processors for file events. These event processors are used to implement different network communication requirements. Commonly used processors are as follows:

In order to respond to each client connected to the server, the server must associate a connection response processor with the listening socket.

In order to receive command requests from the client, the server must associate the command request handler with the client socket.

In order to return the execution result of the command to the client, the server must associate the command reply processor with the client socket.

Connection response processor

The acceptTcpHandler function in networking.c is the connection response processor of Redis. This processor is used to respond to the client connecting to the server's listening socket. The specific implementation is as follows A wrapper for the sys/socket.h/accept function.

When the Redis server is initialized, the program will associate this connection response processor with the AE_READABLE event of the server listening socket. When a client uses the sys/socket.h/connect function to connect to the server listening socket When , the socket will generate an AE_READABLE event, triggering the connection response processor to execute, and perform the corresponding socket response operation, as shown in the figure.

Why is redis said to be single-threaded?

Command request processor

The readQueryFromClient function in networking.c is the command request processor of Redis. This processor is responsible for reading from the socket. The content of the command request sent by the client is specifically implemented as a wrapper of the unistd.h/read function.

When a client successfully connects to the server through the connection response processor, the server will associate the AE_READABLE event of the client socket with the command request processor. When the client sends a command request to the server , the socket will generate an AE_READABLE event, triggering the command request processor to execute, and perform the corresponding socket read operation, as shown in the figure.

Why is redis said to be single-threaded?

#During the entire process of the client connecting to the server, the server will always associate the command request processor for the AE_READABLE event of the client socket.

Command reply processor

The sendReplyToClient function in networking.c is the command reply processor of Redis. This processor is responsible for returning the command reply obtained by the server after executing the command to the client through the socket. end, which is specifically implemented as a wrapper for the unistd.h/write function.

When the server has a command reply that needs to be sent to the client, the server will associate the AE_WRITABLE event of the client socket with the command reply processor. When the client is ready to receive the command reply from the server , the AE_WRITABLE event will be generated, triggering the execution of the command reply processor, and performing the corresponding socket write operation, as shown in the figure.

Why is redis said to be single-threaded?

When the command reply is sent, the server will disassociate the command reply processor from the AE_WRITABLE event of the client socket.

A complete client-server connection event example

Assuming that the Redis server is running, then the AE_READABLE event of the listening socket of this server should be in the listening state, and this event The corresponding processor is the connection response processor.

If a Redis client initiates a connection to the Redis server at this time, the listening socket will generate an AE_READABLE event, triggering the connection response processor to execute: the processor will respond to the client's connection request, and then create The client socket, as well as the client status, and associates the AE_READABLE event of the client socket with the command request processor so that the client can send command requests to the main server.

After that, the client sends a command request to the Redis server, then the client socket will generate an AE_READABLE event, triggering the execution of the command request processor. The processor reads the client's command content and then passes it to the relevant program. to execute.

Executing commands will generate corresponding command replies. In order to transmit these command replies back to the client, the server will associate the AE_WRITABLE event of the client socket with the command reply processor: when the client attempts to read When the command replies, the client socket will generate an AE_WRITABLE event, triggering the execution of the command reply processor. When the command reply processor writes all the command replies to the socket, the server will release the AE_WRITABLE of the client socket. Association between events and command reply handlers.

Why is redis said to be single-threaded?

Related recommendations: redis database tutorial

The above is the detailed content of Why is redis said to be single-threaded?. 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)

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 use the redis command How to use the redis command Apr 10, 2025 pm 08:45 PM

Using the Redis directive requires the following steps: Open the Redis client. Enter the command (verb key value). Provides the required parameters (varies from instruction to instruction). Press Enter to execute the command. Redis returns a response indicating the result of the operation (usually OK or -ERR).

How to use redis lock How to use redis lock Apr 10, 2025 pm 08:39 PM

Using Redis to lock operations requires obtaining the lock through the SETNX command, and then using the EXPIRE command to set the expiration time. The specific steps are: (1) Use the SETNX command to try to set a key-value pair; (2) Use the EXPIRE command to set the expiration time for the lock; (3) Use the DEL command to delete the lock when the lock is no longer needed.

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 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