最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

redis單機(jī)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多,接近官方說的單機(jī)10w qps的寫。

為什么這么快

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

redis完全是基于內(nèi)存的,絕大部分請(qǐng)求是純粹的內(nèi)存操作,所以非??焖佟?br />

簡單的數(shù)據(jù)結(jié)構(gòu)

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

sds數(shù)據(jù)結(jié)構(gòu)

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

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

空間預(yù)分配:當(dāng)空間擴(kuò)展時(shí),不僅分配所需空間,還會(huì)分配額外的空間

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

惰性空間釋放

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

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

跳躍表

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

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

單線程

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

redis4.0的多線程

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

IO多路復(fù)用

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

由于IO多路復(fù)用程序是一個(gè)單線程,那么當(dāng)多個(gè)socket到來時(shí),肯定要排隊(duì),它們總是以隊(duì)列的方式順序地處理。

C10K問題

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

IO多路復(fù)用

IO多路復(fù)用的意思就是多個(gè)網(wǎng)路IO即為多個(gè)TCP連接 復(fù)用一個(gè)進(jìn)程或者線程,這種模型最大的好處就是不用為每個(gè)連接創(chuàng)建一個(gè)進(jìn)程或者線程。比較經(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的缺點(diǎn)是內(nèi)核遍歷的時(shí)間復(fù)雜度是O(n),雖然用戶態(tài)不用遍歷了,減少了陷入內(nèi)核的次數(shù),但是內(nèi)核還是要遍歷的。epoll的優(yōu)點(diǎn)就是內(nèi)核也不需要遍歷了,當(dāng)用戶把fds傳給內(nèi)核時(shí),然后依賴硬件中斷,比如當(dāng)網(wǎng)卡有數(shù)據(jù)到來時(shí),就會(huì)中斷告訴cpu,cpu就知道哪個(gè)fd有數(shù)據(jù)到達(dá)了。

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

總結(jié)

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

以上4點(diǎn)是單線程redis快的主要原因。

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

相關(guān)文章

  • Redis?定長隊(duì)列探索及實(shí)踐

    Redis?定長隊(duì)列探索及實(shí)踐

    這篇文章主要介紹了Redis?定長隊(duì)列探索及實(shí)踐,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Redis高并發(fā)緩存問題分析及解決過程

    Redis高并發(fā)緩存問題分析及解決過程

    文章總結(jié)了Redis緩存的六種常見問題及其解決方案:緩存穿透、緩存擊穿、緩存雪崩、熱點(diǎn)key重建優(yōu)化、緩存和數(shù)據(jù)庫雙寫不一致,以及Redis對(duì)過期key的三種清除策略,每種問題都提供了詳細(xì)的原因分析和具體的解決方案
    2025-01-01
  • Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動(dòng)

    Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動(dòng)

    Redis是一種鍵值對(duì)數(shù)據(jù)庫,也稱為內(nèi)存數(shù)據(jù)庫,因?yàn)樗梢詫?shù)據(jù)存儲(chǔ)在內(nèi)存中,而不是在磁盤上,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動(dòng)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Redis緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性的問題解決

    Redis緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性的問題解決

    隨業(yè)務(wù)增長,直接操作數(shù)據(jù)庫性能下降,引入緩存提高讀性能常見,但緩存和數(shù)據(jù)庫的雙寫操作會(huì)引發(fā)數(shù)據(jù)不一致問題,本文討論幾種常用同步策略,感興趣的可以了解一下
    2024-09-09
  • Linux服務(wù)器使用Redis作為數(shù)據(jù)緩存并用log4j2進(jìn)行日志記錄的過程分享

    Linux服務(wù)器使用Redis作為數(shù)據(jù)緩存并用log4j2進(jìn)行日志記錄的過程分享

    這篇文章主要介紹了Linux服務(wù)器使用Redis作為數(shù)據(jù)緩存并用log4j2日志記錄,關(guān)于SpringBoot項(xiàng)目配置Redis與log4j2是查詢官方文檔,本文中的Redis配置類、Redis工具類以及l(fā)og4j2.xml配置文件來自網(wǎng)絡(luò),查證源自何處比較麻煩,所以在此感謝所有人的分享
    2023-09-09
  • Windows系統(tǒng)安裝Redis的詳細(xì)圖文教程

    Windows系統(tǒng)安裝Redis的詳細(xì)圖文教程

    但有時(shí)候想在windows下折騰下Redis,那么就可以參考下面的方法了,雖然腳本之家小編以前整理了一些,發(fā)現(xiàn)這篇做的比較詳細(xì),下載也給出來了
    2018-08-08
  • Redis解決Session共享問題的方法詳解

    Redis解決Session共享問題的方法詳解

    這篇文章主要為大家詳細(xì)介紹了分布式系統(tǒng)Redis解決Session共享問題的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-07-07
  • redis鎖機(jī)制介紹與實(shí)例

    redis鎖機(jī)制介紹與實(shí)例

    今天小編就為大家分享一篇關(guān)于redis鎖機(jī)制介紹與實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Redis 的 GeoHash詳解

    Redis 的 GeoHash詳解

    這篇文章主要介紹了Redis 的 GeoHash詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • RedisAPI原子性操作及原理解析

    RedisAPI原子性操作及原理解析

    這篇文章主要介紹了RedisAPI原子性操作及原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

龙井市| 文水县| 普宁市| 前郭尔| 枝江市| 五河县| 黑山县| 巴青县| 玉门市| 长白| 武隆县| 垣曲县| 三亚市| 治县。| 淮安市| 祁连县| 三台县| 平定县| 疏附县| 上栗县| 姚安县| 讷河市| 蕉岭县| 特克斯县| 渭南市| 长丰县| 黔南| 伊川县| 大兴区| 黄山市| 东阿县| 通海县| 维西| 道孚县| 天津市| 江山市| 札达县| 科尔| 永定县| 红安县| 镇雄县|