欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談為什么單線程的redis那么快

 更新時間:2021年09月15日 16:35:57   作者:假裝懂編程  
本文主要介紹了為什么單線程的redis那么快,主要介紹了幾點原因,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

redis單機QPS

./redis-benchmark -t set,lpush -n 100000 -q
SET: 82101.80 requests per second
LPUSH: 82440.23 requests per second

在自己的電腦上測試SET和LPUSH10萬次,可以發(fā)現(xiàn)每秒SET和LPUSH大概在8w多,接近官方說的單機10w qps的寫。

為什么這么快

內(nèi)存型數(shù)據(jù)庫

redis完全是基于內(nèi)存的,絕大部分請求是純粹的內(nèi)存操作,所以非常快速。

簡單的數(shù)據(jù)結構

redis目前支持5種數(shù)據(jù)類型(string、list、hash、set、zset),數(shù)據(jù)結構相對簡單,操作起來也相對快速。

sds數(shù)據(jù)結構

對于string來說,redis采用SDS方式來組織數(shù)據(jù):

這種數(shù)據(jù)的核心思想就是空間換時間

空間預分配:當空間擴展時,不僅分配所需空間,還會分配額外的空間

  • 分配后sds長度小于1M,那么也分配同樣大小的額外空間,假設一個key修改后 len=13,那么也分配free=13,最后buf=13+13+1=27
  • 如果分配后len大于等于1M,那么額外固定分配1M,假設修改后len=30M,分配free=1M,最后buf=30M+1M+1byte

惰性空間釋放

  • 假設有個len=13,free=13的字符串,這時候如果字符變短了len=10,那么額外的3個byte的空間也不會回收,先放在free里面,這時候free=16

通過這種分配方式,某些場景下可以減少內(nèi)存申請的次數(shù),從而達到一定的快速

跳躍表

redis的有序集合,采用的跳躍表的數(shù)據(jù)結構,通過層來加快訪問其他節(jié)點

每個節(jié)點會隨機一個層高,比如o1節(jié)點可以通過L4層直接跳到o3,跨度是2,redis的有序集合就是通過這種方式來加快節(jié)點之間的訪問的。

單線程

redis采用單線程模型,單線程的好處在于避免了多線程對數(shù)據(jù)競爭的問題,加鎖的問題,上下文切換的問題。
據(jù)官方解釋,redis的瓶頸不在cpu,而在內(nèi)存或者網(wǎng)絡的帶寬,綜合考慮然后就采用了單線程。這里說的單線程是指處理網(wǎng)絡請求時只是用一個線程,redis本身在持久化的時候還是會用到額外的線程的。

redis4.0的多線程

redis4.0開始也支持了多線程,當然只是針對部分命令采用的是多線程,例如:UNLINK、FLUSHALL 、ASYNC、FLUSHDB。引入這些的目的是:在某些情況下,盡可能的提升效率,假設有一個key大到幾十M,這時DEL這個key的時候,可能會短暫的阻塞,這時如果用unlink來刪除,剛開始只是刪除這個key,真正的value是后臺線程去刪除的。

IO多路復用

redis采用了非阻塞的IO多路復用技術。redis本身就是一個事件驅(qū)動程序,redis把socket抽象成文件事件。這里說的IO多路復用就是文件事件處理器以單線程的方式,來監(jiān)聽相關的套接字(accept、read、write、close)。

由于IO多路復用程序是一個單線程,那么當多個socket到來時,肯定要排隊,它們總是以隊列的方式順序地處理。

C10K問題

在沒有IO多路復用的時候,假設現(xiàn)在有10000個客戶端連接(fd1-10000),但是只有1個客戶端有發(fā)數(shù)據(jù),然而計算機并不知道哪個fd有數(shù)據(jù),只能遍歷10000次,每次都要陷入內(nèi)核,開銷比較大,而且實際上9999次都是浪費的。

IO多路復用

IO多路復用的意思就是多個網(wǎng)路IO即為多個TCP連接 復用一個進程或者線程,這種模型最大的好處就是不用為每個連接創(chuàng)建一個進程或者線程。比較經(jīng)典的模型就是 select、poll、epoll。

  • select:select(fds),一次性把fds交給內(nèi)核,然后內(nèi)核告訴哪些fd可讀可寫(內(nèi)核自己遍歷,而不用用戶遍歷,將多次的系統(tǒng)調(diào)用變成1次系統(tǒng)調(diào)用)。fds最大是1024,這也決定了select模型最大并發(fā)是1024。
  • poll:和select差不多,只不過并發(fā)不止1024了,可以更多
  • epoll: select和poll的缺點是內(nèi)核遍歷的時間復雜度是O(n),雖然用戶態(tài)不用遍歷了,減少了陷入內(nèi)核的次數(shù),但是內(nèi)核還是要遍歷的。epoll的優(yōu)點就是內(nèi)核也不需要遍歷了,當用戶把fds傳給內(nèi)核時,然后依賴硬件中斷,比如當網(wǎng)卡有數(shù)據(jù)到來時,就會中斷告訴cpu,cpu就知道哪個fd有數(shù)據(jù)到達了。

redis默認采用epoll,除非系統(tǒng)不支持。

總結

  • redis是內(nèi)存型數(shù)據(jù)庫
  • redis特殊的數(shù)據(jù)結構
  • 單線程避免鎖的競爭
  • io多路復用

以上4點是單線程redis快的主要原因。

到此這篇關于淺談為什么單線程的redis那么快的文章就介紹到這了,更多相關redis 單線程快內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題及解決

    redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題及解決

    這篇文章主要介紹了redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 一文帶你了解Redis怎么啟動以及使用

    一文帶你了解Redis怎么啟動以及使用

    對于Redis我們一般會使用到三種啟動方式:直接啟動、指定配置文件啟動、開機自啟動,下面這篇文章主要給大家介紹了關于Redis怎么啟動以及使用的相關資料,需要的朋友可以參考下
    2023-04-04
  • linux?redis-連接命令解讀

    linux?redis-連接命令解讀

    這篇文章主要介紹了linux?redis-連接命令解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解Redis數(shù)據(jù)類型實現(xiàn)原理

    詳解Redis數(shù)據(jù)類型實現(xiàn)原理

    這篇文章主要介紹了Redis數(shù)據(jù)類型實現(xiàn)原理,在工作中或?qū)W習中有需要的小伙伴可以參考一下這篇文章
    2021-08-08
  • Govern Service 基于 Redis 的服務治理平臺安裝過程詳解

    Govern Service 基于 Redis 的服務治理平臺安裝過程詳解

    Govern Service 是一個輕量級、低成本的服務注冊、服務發(fā)現(xiàn)、 配置服務 SDK,通過使用現(xiàn)有基礎設施中的 Redis 不用給運維部署帶來額外的成本與負擔,接下來通過本文給大家分享Govern Service 基于 Redis 的服務治理平臺的相關知識,感興趣的朋友一起看看吧
    2021-05-05
  • 從一個小需求感受Redis的獨特魅力(需求設計)

    從一個小需求感受Redis的獨特魅力(需求設計)

    Redis在實際應用中使用的非常廣泛,本篇文章就從一個簡單的需求說起,為你講述一個需求是如何從頭到尾開始做的,又是如何一步步完善的
    2019-12-12
  • Deepin UOS編譯安裝Redis的實現(xiàn)步驟

    Deepin UOS編譯安裝Redis的實現(xiàn)步驟

    本文主要介紹了Deepin UOS編譯安裝Redis的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • 使用Redis解決高并發(fā)方案及思路解讀

    使用Redis解決高并發(fā)方案及思路解讀

    這篇文章主要介紹了使用Redis解決高并發(fā)方案及思路,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Redis簡易延時隊列的實現(xiàn)示例

    Redis簡易延時隊列的實現(xiàn)示例

    在實際的業(yè)務場景中,經(jīng)常會遇到需要延時處理的業(yè)務,本文就來介紹有下Redis簡易延時隊列的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Redis?中ZSET數(shù)據(jù)類型命令使用及對應場景總結(案例詳解)

    Redis?中ZSET數(shù)據(jù)類型命令使用及對應場景總結(案例詳解)

    這篇文章主要介紹了Redis?中ZSET數(shù)據(jù)類型命令使用及對應場景總結,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01

最新評論