Redis series - Single threaded Redis Why so fast ?
Redis Why single thread ?
Before we talk about this problem, let's first understand the common overhead of introducing multithreading :
1. Context switching :
Even single core CPU Multithreaded code execution is also supported ,CPU By assigning each thread CPU Time slice to implement this mechanism . Time slice is CPU Time allocated to each thread , Because the time slice is very short , therefore CPU By constantly switching threads , Let's feel that multiple threads execute at the same time , The time slice is usually tens of milliseconds (ms).
CPU The task is executed circularly through the time slice allocation algorithm , After the current task executes a time slice, it will switch to the next task . however , The status of the previous task is saved before switching , So that the next time you switch back to this task , You can load the status of this task again ,
The process from task saving to reloading is a context switch .
When a new thread is switched in , The data it needs may not be in the local cache of the current processor , Therefore, context switching will result in some cache misses , Therefore, the thread will be slower when it is first scheduled to run . This is why the scheduler allocates a minimum execution time for each runnable thread .
2. Memory synchronization
Memory visibility issues , There is no more introduction here .
3. block :
Locking is required when accessing shared resources to ensure data security , When there is competition on the lock , Threads that fail to compete are blocked .
under normal conditions , After we adopt multithreading , If there is no good system design , Actual results , In fact, it is as shown in the figure on the right . When we first started increasing the number of threads , System throughput will increase , however , When adding more threads , The system throughput grows slowly , Sometimes there will even be a decline .
The key reason is , There are usually shared resources accessed by multiple threads at the same time in the system , For example, a shared data structure . When there are multiple threads to modify the shared resource , To ensure the correctness of shared resources , Additional mechanisms are needed to guarantee , And this additional mechanism , It will bring additional expenses . If there is no fine design , for instance , Simply adopt a coarse-grained mutex , There will be unsatisfactory results : Even if threads are added , Most threads are also waiting to acquire mutexes to access shared resources , Parallel to serial , The system throughput does not increase with the increase of threads .
Redis Why so fast ?
*
Redis It is based on memory
Completely memory based , Most requests are purely memory operations , Very fast . Data stored in memory , be similar to HashMap,HashMap The advantage of is that the time complexity of search and operation is O(1);
*
Simple data structure , The data operation is also simple ,Redis The data structure in is specially designed ;
*
Single thread , Unnecessary context switching and contention conditions are avoided , There is no consumption due to switching caused by multiple processes or threads
CPU, You don't have to think about all kinds of locks , There is no lock release operation , No performance consumption due to possible deadlock ;
*
Redis Multiplexing mechanism of
Linux Medium IO Multiplexing mechanism means that one thread processes multiple IO flow , That's what we often hear select/epoll mechanism . In short , stay Redis
When running a single thread only , This mechanism allows , There are multiple listening sockets and connected sockets at the same time . The kernel always listens for connection requests or data requests on these sockets . Once a request arrives , I'll give it to you
Redis Thread processing , This implements a Redis Threads handle multiple IO Effect of flow .
Technology