一.Redis 到底有多快?
Redis是基於內存的采用單進程和單線程模型的KV數據庫,官方提供的壓測數據可以達到100000+的QPS,這個不比采用單進程多線程的同樣基於內存的KV數據庫Memcached差;
官網給出的基准程序測試:https://redis.io/topics/benchmarks
二.Redis 單線程為什么還能這么快?
- 純內存訪問,所有數據都在內存中,所有的運算都是內存級別的運算,內存響應時間的時間為納秒級別,這是redis達到萬級每秒的基礎。
- 采用單線程,避免了不必要的上下文切換和競爭條件;不存在多線程導致的切換而消耗CPU,不用考慮各種鎖的問題,不存在加鎖和釋放鎖的的操作,沒有因為可能出現的死鎖而導致的性能消耗。(線程是需要內存開銷的,1個線程可能需要2M 存放棧,1000個線程就需要2G的內存)
- redis單線程如何處理那么多並發客戶端連接?回答:非阻塞IO,使用I/O多路復用技術(linux下可以使用epoll/poll/select)。多路復用是指使用一個線程來檢查多個文件符FD(socket,文件,管道)的就緒狀態;比如select和poll函數,傳入多個文件描述符,一個文件符就緒,則返回,否則阻塞直到超時。

這樣在處理1000個連接的時候,只需要1個線程監控就緒狀態,對就緒的每個連接開一個線程處理就可以了,這樣需要的線程數大大減少,減少了內存開銷和上下文切換的CPU開銷。

說明:至選擇哪種多路復用技術,在ae.c里有預處理的控制,也就是說,這些文件最后只有一個能夠被編譯。優先選擇epoll或者kqueue(FREEBSD和Mac OSX可用)可用其次是select。服務器運行時主要關注兩大類型的事件:文件事件和時間事件。文件事件指的是socket文件描述符FD的讀寫就緒情況,
【Redis 和 I/O 多路復用】: https://draveness.me/redis-io-multiplexing
【為什redis是單線程這么快】:https://blog.csdn.net/xlgen157387/article/details/79470556
