高并發架構系列:Redis為什么是單線程、及高并發快的3大原因詳解

Redis的高并發和快速原因

1.redis是基于內存的,內存的讀寫速度非常快;
2.redis是單線程的,省去了很多上下文切換線程的時間;
3.redis使用多路復用技術,可以處理并發的連接。非阻塞IO 內部實現采用epoll,采用了epoll+自己實現的簡單的事件框架。epoll中的讀、寫、關閉、連接都轉化成了事件,然后利用epoll的多路復用特性,絕不在io上浪費一點時間。

下面重點介紹單線程設計和IO多路復用核心設計快的原因。

# 為什么Redis是單線程的
1.官方答案
因為Redis是基于內存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內存的大小或者網絡帶寬。既然單線程容易實現,而且CPU不會成為瓶頸,那就順理成章地采用單線程的方案了。

2.性能指標
關于redis的性能,官方網站也有,普通筆記本輕松處理每秒幾十萬的請求。

3.詳細原因
1)不需要各種鎖的性能消耗
Redis的數據結構并不全是簡單的Key-Value,還有list,hash等復雜的結構,這些結構有可能會進行很細粒度的操作,比如在很長的列表后面添加一個元素,在hash當中添加或者刪除一個對象。這些操作可能就需要加非常多的鎖,導致的結果是同步開銷大大增加。總之,在單線程的情況下,就不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗。

2)單線程多進程集群方案
單線程的威力實際上非常強大,每核心效率也非常高,多線程自然是可以比單線程有更高的性能上限,但是在今天的計算環境中,即使是單機多線程的上限也往往不能滿足需要了,需要進一步摸索的是多服務器集群化的方案,這些方案中多線程的技術照樣是用不上的。

所以單線程、多進程的集群不失為一個時髦的解決方案。

3)CPU消耗

采用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU。但是如果CPU成為Redis瓶頸,或者不想讓服務器其他CUP核閑置,那怎么辦?可以考慮多起幾個Redis進程,Redis是key-value數據庫,不是關系數據庫,數據之間沒有約束。只要客戶端分清哪些key放在哪個Redis進程上就可以了。

# Redis單線程的優劣勢

1)單進程單線程優勢
代碼更清晰,處理邏輯更簡單
不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗
不存在多進程或者多線程導致的切換而消耗CPU

2)單進程單線程弊端
無法發揮多核CPU性能,不過可以通過在單機開多個Redis實例來完善。

# IO多路復用技術
redis 采用網絡IO多路復用技術來保證在多連接的時候, 系統的高吞吐量。

多路-指的是多個socket連接,復用-指的是復用一個線程。多路復用主要有三種技術:select,poll,epoll。epoll是最新的也是目前最好的多路復用技術。

這里“多路”指的是多個網絡連接,“復用”指的是復用同一個線程。采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網絡IO的時間消耗),且Redis在內存中操作數據的速度非常快(內存內的操作不會成為這里的性能瓶頸),主要以上兩點造就了Redis具有很高的吞吐量。

# Redis高并發快總結

  1. Redis是純內存數據庫,一般都是簡單的存取操作,線程占用的時間很多,時間的花費主要集中在IO上,所以讀取速度快。
  2. 再說一下IO,Redis使用的是非阻塞IO,IO多路復用,使用了單線程來輪詢描述符,將數據庫的開、關、讀、寫都轉換成了事件,減少了線程切換時上下文的切換和競爭。
  3. Redis采用了單線程的模型,保證了每個操作的原子性,也減少了線程的上下文切換和競爭。
  4. 另外,數據結構也幫了不少忙,Redis全程使用hash結構,讀取速度快,還有一些特殊的數據結構,對數據存儲進行了優化,如壓縮表,對短數據進行壓縮存儲,再如,跳表,使用有序的數據結構加快讀取的速度。
  5. 還有一點,Redis采用自己實現的事件分離器,效率比較高,內部采用非阻塞的執行方式,吞吐能力比較大。

以上就是redis高并發快的詳解,我是優知學院mike,原BAT高級研發經理、架構師,每日分享bat架構+面試真經+技術干貨!堅持原創不易,覺得不錯點贊支持,送你【BAT架構80期學習資料合集】,回復【架構】領取。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252786.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252786.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252786.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2、C#基礎 - Visual Studio 的版本選擇和下載

有句話說:工欲善其事,必先利其器,我不推薦在學習一個語言時使用記事本練習,甚至說相當的排斥。當然了,你也可以選擇你自己喜歡的方式。本系列推薦使用的IDE為vs2017 community版,銀子不夠的同志不用怕&…

紅外攝像機的原理及選擇

一、紅外基本原理介紹 光是一種電磁波,它的波長區間從幾個納米(1nm10-9m,十億分之一米)到 1 毫米(mm)左右。人眼可見的只是其中一部分,我們稱其為可見光,可見光的波長范圍為 380nm …

第六章 預處理器

宏就是文字展開,實際中能夠展開寫出來發現錯誤。6.1 不能忽視宏定義中的空格 6.2 宏并非函數宏定義一個函數時,1、要把每一個參數用括號括起來2、同一時候也要把整個表達式括起來。3、要確保宏中的參數沒有副作用#define max(a,b) ((a)>(b)?(a):(b)…

oracle 數據庫中執行數據庫語句能找到數據,但是程序中卻抓取不到

oracle 數據庫中執行數據庫語句能找到數據,但是程序中卻抓取不到? 原因:數據庫中插入數據時沒有commit,執行COMMIT后就可以查詢到。轉載于:https://www.cnblogs.com/hanje/p/10140307.html

Python3經典100道練習題003

題目:一個整數,它加上100后是一個完全平方數,再加上268又是一個完全平方數,請問該數是多少? 方法:利用循環去判斷x100和x268是否為完全平方數,沒用使用其他函數,缺點運算速度慢 1 x-…

紅外攝像機

在監控市場中,紅外攝像機之所以那么受市場的歡迎,主要還是因為它有強勁的夜視性能。市場上,普通的彩色攝像機基本上沒有夜視能力,如果需要在夜晚獲得清晰的圖像,必須借助額外的可見光源照明才能實現。那么監控攝像機系…

P3375 【模板】KMP字符串匹配

題目描述 如題,給出兩個字符串s1和s2,其中s2為s1的子串,求出s2在s1中所有出現的位置。 為了減少騙分的情況,接下來還要輸出子串的前綴數組next。如果你不知道這是什么意思也不要問,去百度搜[kmp算法]學習一下就知道了。…

[譯] 用 Shadow DOM v1 和 Custom Elements v1 實現一個原生 Web Component

原文地址:Make a Native Web Component with Custom Elements v1 and Shadow DOM v1原文作者:Pearl Latteier譯文出自:掘金翻譯計劃本文永久鏈接:github.com/xitu/gold-m…譯者:newraina校對者:CoderMing假…

php 原生文件下載

1.整個網頁的html界面源碼下載: xiazai.php <html> <head> <meta charset "utf-8"> <title></title> </head> <body> <form method"post" action"xiazai.php"> <input type"submit&quo…

紅外線攝像機的選擇與使用及原理

紅外線攝像機的選擇與使用及原理 用戶使用紅外燈首先要仔細閱讀使用說明書&#xff0c;特別是為保證人身設備安全的注意事項。檢查前面所講述的配套性方面是否達到要求&#xff0c;應考慮到的影響因素是否考慮到&#xff0c;如未達到要求&#xff0c;可及時調整所用器材。 紅…

asp 之 讓實體中字段類型為DateTime的字段僅僅顯示日期不顯示時間

在我們平時的工作開發中。我們一般會遇到這種一個問題&#xff1a;某個實體的某個字段是DateTime類型的&#xff0c;但是我們在界面上僅僅想讓它顯示日期不顯示時間&#xff01;一個訂單實體&#xff1a;//訂單類public class order{//訂單IDpublic int id{get;set;}//物品IDpu…

JQ的異步文件上傳

一,view代碼 <form role"form"><div class"form-group"><label for"keyinput">選擇文件&#xff1a;</label><input type"file" name"upfile" id"upfile" /></div><div c…

紅外成像與微光成像的區別

在現有的安防技術中,微光和紅外成像是運用最廣的夜視技術.而微光成像主要運用在反恐偵查,部隊作戰的夜視儀中、而紅外夜視成像主要用于監控攝像機的夜間監控較多.   微光成像技術微光夜視技術又稱像增強技術&#xff0c;是通過帶像增強管的夜視鏡&#xff0c;對夜天光照亮的微…

實體類和數據表的映射異常(XXX is not mapping[ ])

在使用SSH框架開發過程&#xff0c;使用hibernate框架提供的工具類實現與數據庫數據交互&#xff0c;在執行cmd操作時&#xff0c;如果出現以下異常&#xff1a; org.hibernate.hql.ast.QuerySyntaxException: xxx is not mapped [from xxx] 或者 nested exception is org.hibe…

Linux下配置LVM

1 LVM介紹LVM(Logical Volume Manager)邏輯卷管理&#xff0c;它是Linux環境下對磁盤分區進行管理的一種機制&#xff0c;LVM是建立在硬盤和分區之上的一個邏輯層&#xff0c;來提高磁盤分區管理的靈活性。通過LVM系統管理員可以輕松管理磁盤分區&#xff0c;邏輯卷管理器的技術…

Python3 配置文件(configparser)(轉載)

本文由 Luzhuo 編寫,轉發請保留該信息. 原文: http://blog.csdn.net/rozol/article/details/72793304 以下代碼以Python3.6.1為例 Less is more! configparser 可以讀寫和解析注釋文件, 但是沒有寫入注釋的功能 1 #!/usr/bin/env python2 # codingutf-83 __author__ Luzhuo4 _…

激光攝像機的原理及應用

近年來&#xff0c;在安防監控領域&#xff0c;以目前視頻監控技術的發展情況&#xff0c;室內監控和白天正常環境下的監控已不是難題&#xff0c;但社會環境的發展日新月異&#xff0c;城市的發展、森林資源的不斷流失、大型項目的建設、邊防安全的守護等&#xff0c;這些環境…

Object.defineProperty 詳解

最近想了解一下Vue是怎么實現數據雙向綁定的&#xff0c;了解到是基于Object.definProperty,在此記錄一下。 Object.defineProperty  顧名思義&#xff0c;就是給對象定義一個屬性&#xff0c;總共有這么幾種&#xff1a; value  屬性的值writable  是否可改寫&#xff0…

Java 實現排序

public class Sort {public static void main(String[] args) {int data[] {43,54,123,5,98,10,7,74,5,54};System.out.println("原先數組&#xff1a;");for(int d : data) {System.out.print(d " ");}System.out.println("\n");/*System.ou…

相機幀率和曝光時間的關系

文章轉載自&#xff1a;http://blog.163.com/pluto_918/blog/static/203853902012111255634175/ 工業相機參數之幀率相關知識詳解&#xff1a; 工業相機是機器視覺系統的重要組成部分之一&#xff0c;在機器視覺系統中有著非常重要的作用。工業相機已經被廣泛應用于工業生產線…