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

詳解Redis單線程的正確理解

 更新時間:2021年05月08日 10:00:46   作者:小白菜_1  
這篇文章主要介紹了詳解Redis單線程的正確理解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

很多同學(xué)對Redis的單線程和I/O多路復(fù)用技術(shù)并不是很了解,所以我用簡單易懂的語言讓大家了解下Redis單線程和I/O多路復(fù)用技術(shù)的原理,對學(xué)好和運用好Redis打下基礎(chǔ)。

一、Redis的單線程理解

Redis客戶端對服務(wù)端的每次調(diào)用都經(jīng)歷了發(fā)送命令,執(zhí)行命令,返回結(jié)果三個過程。其中執(zhí)行命令階段,由于Redis是單線程來處理命令的,所有到達服務(wù)端的命令都不會立刻執(zhí)行,所有的命令都會進入一個隊列中,然后逐個執(zhí)行,并且多個客戶端發(fā)送的命令的執(zhí)行順序是不確定的,但是可以確定的是不會有兩條命令被同時執(zhí)行,不會產(chǎn)生并發(fā)問題,這就是Redis的單線程基本模型。

Redis服務(wù)器通過socket(套接字)與客戶端或其他Redis服務(wù)器進行連接,而文件事件就是服務(wù)器對socket操作的抽象。服務(wù)器與客戶端或其他服務(wù)器的通信會產(chǎn)生相應(yīng)的文件事件,而服務(wù)器通過監(jiān)聽并處理這些事件來完成一系列網(wǎng)絡(luò)通信操作。

Redis基于Reactor模式開發(fā)了自己的網(wǎng)絡(luò)事件處理器——文件事件處理器,文件事件處理器使用I/O多路復(fù)用程序來同時監(jiān)聽多個socket(I/O多路復(fù)用技術(shù)下面有介紹),并根據(jù)socket目前執(zhí)行的任務(wù)來為socket關(guān)聯(lián)不同的事件處理器。當(dāng)被監(jiān)聽的socket準(zhǔn)備好執(zhí)行連接應(yīng)答、讀取、寫入、關(guān)閉等操作時,與操作相對應(yīng)的文件事件就會產(chǎn)生,這時文件事件處理器就會調(diào)用socket之前已關(guān)聯(lián)好的事件處理器來處理這些事件。

文件事件處理器的構(gòu)成:

 

注意:其中I/O多路復(fù)用程序通過隊列向文件事件分派器傳送socket

二、I/O多路復(fù)用技術(shù)

關(guān)于I/O多路復(fù)用(又被稱為“事件驅(qū)動”),首先要理解的是,操作系統(tǒng)為你提供了一個功能,當(dāng)你的某個socket可讀或者可寫的時候,它可以給你一個通知。這樣當(dāng)配合非阻塞的socket使用時,只有當(dāng)系統(tǒng)通知我哪個描述符可讀了,我才去執(zhí)行read操作,可以保證每次read都能讀到有效數(shù)據(jù)而不做純返回-1和EAGAIN的無用功,寫操作類似。

操作系統(tǒng)的這個功能是通過select/poll/epoll/kqueue之類的系統(tǒng)調(diào)用函數(shù)來實現(xiàn),這些函數(shù)都可以同時監(jiān)視多個描述符的讀寫就緒狀況,這樣,多個描述符的I/O操作都能在一個線程內(nèi)并發(fā)交替地順序完成,這就叫I/O多路復(fù)用,這里的“多路”指的是多個網(wǎng)絡(luò)連接,“復(fù)用”指的是復(fù)用同一個Redis處理線程。(正如上圖所示)

采用多路 I/O 復(fù)用技術(shù)可以讓單個線程高效的處理多個連接請求(盡量減少網(wǎng)絡(luò) I/O 的時間消耗),且 Redis 在內(nèi)存中操作數(shù)據(jù)的速度非???,也就是說內(nèi)存內(nèi)的操作不會成為影響Redis性能的瓶頸,所有 Redis 具有很高的吞吐量。

三、常見疑問解答

1、Redis的單線程為什么這么快?

1.完全基于內(nèi)存,絕大部分請求是純粹的內(nèi)存操作,非??焖佟?shù)據(jù)存在內(nèi)存中,類似于HashMap,HashMap的優(yōu)勢就是查找和操作的時間復(fù)雜度都是O(1);

2.數(shù)據(jù)結(jié)構(gòu)簡單,對數(shù)據(jù)操作也簡單,Redis中的數(shù)據(jù)結(jié)構(gòu)是專門進行設(shè)計的;

3.采用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導(dǎo)致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現(xiàn)死鎖而導(dǎo)致的性能消耗;

4.使用多路I/O復(fù)用模型,非阻塞I/O;

5.Redis直接自己構(gòu)建了VM 機制 ,因為一般的系統(tǒng)調(diào)用系統(tǒng)函數(shù)的話,會浪費一定的時間去移動和請求;

2、為什么不采用多進程或多線程處理?

1.多線程處理可能涉及到鎖

2.多線程處理會涉及到線程切換而消耗CPU

3、單線程處理的缺點?

1.耗時的命令會導(dǎo)致并發(fā)的下降,不只是讀并發(fā),寫并發(fā)也會下降

2.無法發(fā)揮多核CPU性能,不過可以通過在單機開多個Redis實例來完善

4、Redis不存在線程安全問題?

Redis采用了線程封閉的方式,把任務(wù)封閉在一個線程,自然避免了線程安全問題,不過對于需要依賴多個redis操作(即:多個Redis操作命令)的復(fù)合操作來說,依然需要鎖,而且有可能是分布式鎖。

到此這篇關(guān)于詳解Redis單線程的正確理解的文章就介紹到這了,更多相關(guān)Redis單線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis實現(xiàn)排名功能的示例代碼

    Redis實現(xiàn)排名功能的示例代碼

    本文主要介紹了Redis實現(xiàn)排名功能的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 如何使用Redis實現(xiàn)電商系統(tǒng)的庫存扣減

    如何使用Redis實現(xiàn)電商系統(tǒng)的庫存扣減

    在日常開發(fā)中有很多地方都有類似扣減庫存的操作,本文主要介紹了如何使用Redis實現(xiàn)電商系統(tǒng)的庫存扣減,具有一定的參考價值,感興趣的可以了解一下
    2022-01-01
  • antd為Tree組件標(biāo)題附加操作按鈕功能

    antd為Tree組件標(biāo)題附加操作按鈕功能

    這篇文章主要介紹了antd為Tree組件標(biāo)題附加操作按鈕功能,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Redis數(shù)據(jù)備份與恢復(fù)方式的五種方式

    Redis數(shù)據(jù)備份與恢復(fù)方式的五種方式

    本文主要介紹了Redis數(shù)據(jù)備份與恢復(fù)方式,包含了五種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Redis刪除策略的三種方法及逐出算法

    Redis刪除策略的三種方法及逐出算法

    這篇文章主要介紹了Redis刪除策略的三種方法及逐出算法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Redis調(diào)用Lua腳本及使用場景快速掌握

    Redis調(diào)用Lua腳本及使用場景快速掌握

    Redis?是一種非常流行的內(nèi)存數(shù)據(jù)庫,常用于數(shù)據(jù)緩存與高頻數(shù)據(jù)存儲。大多數(shù)開發(fā)人員可能聽說過redis可以運行?Lua?腳本,但是可能不知道redis在什么情況下需要使用到Lua腳本
    2022-03-03
  • Redis存儲斷點續(xù)傳文件狀態(tài)的最佳實踐

    Redis存儲斷點續(xù)傳文件狀態(tài)的最佳實踐

    在斷點續(xù)傳系統(tǒng)中,如何高效地存儲和更新文件上傳狀態(tài)是關(guān)鍵,得益于 Redis 高效的內(nèi)存操作和多種數(shù)據(jù)結(jié)構(gòu)的支持,它非常適合用于存儲上傳過程中的臨時狀態(tài)信息,下面,我們將探討如何利用 Redis 實現(xiàn)文件上傳狀態(tài)的存儲,需要的朋友可以參考下
    2024-12-12
  • Redis Template使用詳解示例教程

    Redis Template使用詳解示例教程

    RedisTemplate的底層通過RedisConnectionFactory對多種Redis驅(qū)動進行集成,上層通過RedisOperations提供豐富的API,并結(jié)合Spring基于泛型的bean注入,為開發(fā)提供了極大的便利,這篇文章主要介紹了Redis Template使用詳解示例教程,需要的朋友可以參考下
    2023-11-11
  • Redis密碼設(shè)置與訪問限制實現(xiàn)方法

    Redis密碼設(shè)置與訪問限制實現(xiàn)方法

    這篇文章主要介紹了Redis密碼設(shè)置與訪問限制實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Redis集群的三種部署方式及三種應(yīng)用問題的處理

    Redis集群的三種部署方式及三種應(yīng)用問題的處理

    這篇文章主要介紹了Redis集群的三種部署方式及三種應(yīng)用問題的處理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論

秦安县| 邻水| 靖安县| 习水县| 株洲市| 铜梁县| 敖汉旗| 社会| 依安县| 建瓯市| 托里县| 满城县| 岚皋县| 阳谷县| 辉南县| 隆化县| 陈巴尔虎旗| 三亚市| 黑水县| 香港| 电白县| 张家口市| 新兴县| 永福县| 会理县| 宾川县| 安顺市| 浦县| 濮阳县| 大方县| 桐梓县| 曲阳县| 齐齐哈尔市| 湖北省| 兰州市| 辛集市| 永仁县| 崇州市| 美姑县| 睢宁县| 察雅县|