精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Redis為何選擇單線程

麥辣雞腿堡 ? 來源:程序員庫森 ? 作者:程序員庫森 ? 2023-10-09 10:59 ? 次閱讀

Redis為何選擇單線程?

在Redisv6.0以前,Redis的核心網絡模型選擇用單線程來實現。

核心意思就是,對于一個 DB 來說,CPU 通常不會是瓶頸,因為大多數請求不會是 CPU 密集型的,而是 I/O 密集型。

具體到 Redis的話,如果不考慮 RDB/AOF 等持久化方案,Redis是完全的純內存操作,執行速度是非常快的,因此這部分操作通常不會是性能瓶頸,Redis真正的性能瓶頸在于網絡 I/O,也就是客戶端和服務端之間的網絡傳輸延遲,因此 Redis選擇了單線程的 I/O 多路復用來實現它的核心網絡模型。

實際上更加具體的選擇單線程的原因如下:

避免過多的上下文切換開銷:如果是單線程則可以規避進程內頻繁的線程切換開銷,因為程序始終運行在進程中單個線程內,沒有多線程切換的場景。

避免同步機制的開銷:如果 Redis選擇多線程模型,又因為 Redis是一個數據庫,那么勢必涉及到底層數據同步的問題,則必然會引入某些同步機制,比如鎖,而我們知道 Redis不僅僅提供了簡單的 key-value 數據結構,還有 list、set 和 hash 等等其他豐富的數據結構,而不同的數據結構對同步訪問的加鎖粒度又不盡相同,可能會導致在操作數據過程中帶來很多加鎖解鎖的開銷,增加程序復雜度的同時還會降低性能。

簡單可維護:如果 Redis使用多線程模式,那么所有的底層數據結構都必須實現成線程安全的,這無疑又使得 Redis的實現變得更加復雜。

總而言之,Redis選擇單線程可以說是多方博弈之后的一種權衡:在保證足夠的性能表現之下,使用單線程保持代碼的簡單和可維護性。

Redis真的是單線程?

討論 這個問題前,先看下 Redis的版本中兩個重要的節點:

Redis 4.0(引入多線程處理異步任務)

Redis 6.0(正式在網絡模型中實現 I/O 多線程)

所以,網絡上說的Redis是單線程,通常是指在Redis 6.0之前,其核心網絡模型使用的是單線程;而Redis的異步任務使用的仍是多線程。

Redis在 4.0 版本的時候就已經引入了的多線程來做一些異步操作,此舉主要針對的是那些非常耗時的命令,通過將這些命令的執行進行異步化,避免阻塞單線程的事件循環。

在 Redis 4.0 之后增加了一些的非阻塞命令如 UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC。

Redisv6.0為何引入多線程?

很簡單,就是 Redis的網絡 I/O 瓶頸已經越來越明顯了。

隨著互聯網的飛速發展,互聯網業務系統所要處理的線上流量越來越大,Redis的單線程模式會導致系統消耗很多 CPU 時間在網絡 I/O 上從而降低吞吐量,要提升 Redis的性能有兩個方向:

優化網絡 I/O 模塊

提高機器內存讀寫的速度

后者依賴于硬件的發展,暫時無解。所以只能從前者下手,網絡 I/O 的優化又可以分為兩個方向:

零拷貝技術或者 DPDK 技術

利用多核優勢

零拷貝技術有其局限性,無法完全適配 Redis這一類復雜的網絡 I/O 場景,更多網絡 I/O 對 CPU 時間的消耗和 Linux 零拷貝技術。而 DPDK 技術通過旁路網卡 I/O 繞過內核協議棧的方式又太過于復雜以及需要內核甚至是硬件的支持。

因此,利用多核優勢成為了優化網絡 I/O 性價比最高的方案。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 網絡
    +關注

    關注

    14

    文章

    7514

    瀏覽量

    88626
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19651
  • Redis
    +關注

    關注

    0

    文章

    371

    瀏覽量

    10846
收藏 人收藏

    評論

    相關推薦

    Redis7單線程與多線程詳解

    主要是指Redis的網絡IO和鍵值對讀寫是由一個線程來完成的。
    的頭像 發表于 01-16 17:33 ?1763次閱讀
    <b class='flag-5'>Redis</b>7<b class='flag-5'>單線程</b>與多<b class='flag-5'>線程</b>詳解

    單線程的雙任務調度

    STM32是單線程的,通信協議層和應用功能層的耦合性比較低,如果獨立運行,提高效率不少,主要實現的方法有哪些呢?
    發表于 01-10 10:15

    單線程SRAM靜態內存使用

    概述本篇只要介紹這么使用STM32CubeMx工具添加RT-Thread操作系統組件,碼代碼的IDE是keil。介紹單線程SRAM靜態內存使用。如果還不知道,這么使用STM32CubeMx工具添加
    發表于 08-24 06:57

    一種單線程編程思路簡析

    事件驅動?邏輯控制?基于回調的事件驅動或者邏輯控制特點代碼接口實現用法基于回調的事件驅動或者邏輯控制本文提供了一種單線程編程思路,并簡單實現了該思路。受PLC編程線圈和觸點概念的啟發。將程序抽象理解
    發表于 02-16 06:58

    線程好還是單線程好?單線程和多線程的區別 優缺點分析

    摘要:如今單線程與多線程已經得到普遍運用,那么到底多線程好還是單線程好呢?單線程和多線程的區別又
    發表于 12-08 09:33 ?8.1w次閱讀

    從I/O的阻塞與非阻塞、I/O處理的單線程與多線程角度探討服務器模型

    這里探討的服務器模型主要指的是服務器端對I/O的處理模型。從不同維度可以有不同的分類,這里從I/O的阻塞與非阻塞、I/O處理的單線程與多線程角度探討服務器模型。
    的頭像 發表于 01-08 16:13 ?6973次閱讀

    阿里云Redis線程性能提升思路解析

    摘要:?Redis做為高性能的K-V數據庫,由于其高性能,豐富的數據結構支持,易用等特性,而得到廣泛的應用。但是由于redis單進程單線程的模型限制,單Redis Server QPS
    發表于 08-30 16:41 ?257次閱讀

    實現Java多線程爬蟲的兩點

    在我們調試爬蟲程序的時候,單線程爬蟲沒什么問題,但是當我們在線上環境使用單線程爬蟲程序去采集網頁時,單線程就暴露出了兩個致命的問題:
    的頭像 發表于 05-05 21:25 ?1938次閱讀
    實現Java多<b class='flag-5'>線程</b>爬蟲的兩點

    這款16核怪物在單線程和多線程性能方面均躍居主流處理器榜首

    盡管AMD一段時間以來一直在主流芯片中注入更多的內核,但在單線程性能方面,這家芯片制造商的產品還不能與Intel的產品相提并論。如果這些PassMark號碼準確無誤,那么Zen 3似乎終于可以輕而易舉地獲得AMD的青睞。
    的頭像 發表于 10-28 15:24 ?2068次閱讀

    Redis常見面試題及答案

    本文的面試題如下: Redis 持久化機制 緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問題 熱點數據和冷數據是什么 Memcache與Redis的區別都有哪些? 單線程redis
    的頭像 發表于 12-16 11:44 ?2167次閱讀
    <b class='flag-5'>Redis</b>常見面試題及答案

    單線程也能開發異步任務?ACE JS框架到底是如何做到的

    HarmonyOS 2提供了兩種應用開發語言:Java和JS。Java線程特性能夠讓多任務并行,充分利用硬件資源開發出高性能的應用。而JS卻是一個單線程語言,無法像Java一樣創建新的Thread
    的頭像 發表于 08-13 17:16 ?2006次閱讀
    <b class='flag-5'>單線程</b>也能開發異步任務?ACE JS框架到底是如何做到的

    Redis基礎架構設計及核心網絡模型架構演進

    性能優異的服務離不開好的架構設計,Redis使用 I/O multiplexing 實現了單線程接收海量客戶端請求;通過單線程Reactor模型實現了高性能的事件處理
    發表于 10-11 15:08 ?427次閱讀

    單線程是否會引起 fail-fast機制

    ConcurrentModificationException 異常,產生 fail-fast 事件。 多線程?并發修改?才會引起 fail-fast 機制保護程序?小 B 覺得這個答案沒有說全,面試官說了單線程
    的頭像 發表于 10-10 16:31 ?379次閱讀
    <b class='flag-5'>單線程</b>是否會引起 fail-fast機制

    Go在單線程計算性能上的優勢

    一文中,我們討論了Go在單線程計算性能上的優勢。 現在,考慮這樣的一種場景: 我們需要從某些網址中同步數據并進行計算,保存到本地redis緩存中。 現在,我們可以通過編寫Go Worker的方式
    的頭像 發表于 11-02 11:16 ?447次閱讀
    Go在<b class='flag-5'>單線程</b>計算性能上的優勢

    redis線程還能保證線程安全嗎

    Redis是一種使用C語言編寫的高性能鍵值存儲系統,它是單線程的,因為使用了多路復用的方式來處理并發請求。這樣的實現方式帶來了很好的性能,但同時也引發了一些線程安全方面的問題。 在Redis
    的頭像 發表于 12-05 10:28 ?1690次閱讀