www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]程序員經(jīng)常要面臨的一個問題就是:如何提高程序性能? 這篇文章,我們循序漸進(jìn),從內(nèi)存、磁盤I/O、網(wǎng)絡(luò)I/O、CPU、緩存、架構(gòu)、算法等多層次遞進(jìn),串聯(lián)起高性能開發(fā)十大必須掌握的核心技術(shù)。

程序員經(jīng)常要面臨的一個問題就是:如何提高程序性能?

這篇文章,我們循序漸進(jìn),從內(nèi)存、磁盤I/O、網(wǎng)絡(luò)I/O、CPU、緩存、架構(gòu)、算法等多層次遞進(jìn),串聯(lián)起高性能開發(fā)十大必須掌握的核心技術(shù)。

- I/O優(yōu)化:零拷貝技術(shù)
- I/O優(yōu)化:多路復(fù)用技術(shù)
-?線程池技術(shù)
-?無鎖編程技術(shù)
-?進(jìn)程間通信技術(shù)
-?RPC?&&?序列化技術(shù)
-?數(shù)據(jù)庫索引技術(shù)
-?緩存技術(shù)?&&?布隆過濾器
-?全文搜索技術(shù)
-?負(fù)載均衡技術(shù)

準(zhǔn)備好了嗎,坐穩(wěn)了,發(fā)車!

首先,我們從最簡單的模型開始。

老板告訴你,開發(fā)一個靜態(tài)web服務(wù)器,把磁盤文件(網(wǎng)頁、圖片)通過網(wǎng)絡(luò)發(fā)出去,怎么做?

你花了兩天時間,擼了一個1.0版本:

  • 主線程進(jìn)入一個循環(huán),等待連接
  • 來一個連接就啟動一個工作線程來處理
  • 工作線程中,等待對方請求,然后從磁盤讀文件、往套接口發(fā)送數(shù)據(jù),完事兒

上線一天,老板發(fā)現(xiàn)太慢了,大一點的圖片加載都有卡頓感。讓你優(yōu)化,這個時候,你需要:

I/O優(yōu)化:零拷貝技術(shù)

上面的工作線程,從磁盤讀文件、再通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù),數(shù)據(jù)從磁盤到網(wǎng)絡(luò),兜兜轉(zhuǎn)轉(zhuǎn)需要拷貝四次,其中CPU親自搬運都需要兩次。

10大高性能開發(fā)寶石,我要消滅一半程序員!

零拷貝技術(shù),解放CPU,文件數(shù)據(jù)直接從內(nèi)核發(fā)送出去,無需再拷貝到應(yīng)用程序緩沖區(qū),白白浪費資源。

10大高性能開發(fā)寶石,我要消滅一半程序員!

Linux API:

ssize_t?sendfile(
??int?out_fd,?
??int?in_fd,?
??off_t?*offset,?
??size_t?count
??);

函數(shù)名字已經(jīng)把函數(shù)的功能解釋的很明顯了:發(fā)送文件。指定要發(fā)送的文件描述符和網(wǎng)絡(luò)套接字描述符,一個函數(shù)搞定!

用上了零拷貝技術(shù)后開發(fā)了2.0版本,圖片加載速度明顯有了提升。不過老板發(fā)現(xiàn)同時訪問的人變多了以后,又變慢了,又讓你繼續(xù)優(yōu)化。這個時候,你需要:

I/O優(yōu)化:多路復(fù)用技術(shù)

前面的版本中,每個線程都要阻塞在recv等待對方的請求,這來訪問的人多了,線程開的就多了,大量線程都在阻塞,系統(tǒng)運轉(zhuǎn)速度也隨之下降。

這個時候,你需要多路復(fù)用技術(shù),使用select模型,將所有等待(accept、recv)都放在主線程里,工作線程不需要再等待。

10大高性能開發(fā)寶石,我要消滅一半程序員!

過了一段時間之后,網(wǎng)站訪問的人越來越多了,就連select也開始有點應(yīng)接不暇,老板繼續(xù)讓你優(yōu)化性能。

這個時候,你需要升級多路復(fù)用模型為epoll。

select有三弊,epoll有三優(yōu)。

  • select底層采用數(shù)組來管理套接字描述符,同時管理的數(shù)量有上限,一般不超過幾千個,epoll使用樹和鏈表來管理,同時管理數(shù)量可以很大。

  • select不會告訴你到底哪個套接字來了消息,你需要一個個去詢問。epoll直接告訴你誰來了消息,不用輪詢。

  • select進(jìn)行系統(tǒng)調(diào)用時還需要把套接字列表在用戶空間和內(nèi)核空間來回拷貝,循環(huán)中調(diào)用select時簡直浪費。epoll統(tǒng)一在內(nèi)核管理套接字描述符,無需來回拷貝。

用上了epoll多路復(fù)用技術(shù),開發(fā)了3.0版本,你的網(wǎng)站能同時處理很多用戶請求了。


但是貪心的老板還不滿足,不舍得升級硬件服務(wù)器,卻讓你進(jìn)一步提高服務(wù)器的吞吐量。你研究后發(fā)現(xiàn),之前的方案中,工作線程總是用到才創(chuàng)建,用完就關(guān)閉,大量請求來的時候,線程不斷創(chuàng)建、關(guān)閉、創(chuàng)建、關(guān)閉,開銷挺大的。這個時候,你需要:

線程池技術(shù)

我們可以在程序一開始啟動后就批量啟動一波工作線程,而不是在有請求來的時候才去創(chuàng)建,使用一個公共的任務(wù)隊列,請求來臨時,向隊列中投遞任務(wù),各個工作線程統(tǒng)一從隊列中不斷取出任務(wù)來處理,這就是線程池技術(shù)。

10大高性能開發(fā)寶石,我要消滅一半程序員!

多線程技術(shù)的使用一定程度提升了服務(wù)器的并發(fā)能力,但同時,多個線程之間為了數(shù)據(jù)同步,常常需要使用互斥體、信號、條件變量等手段來同步多個線程。這些重量級的同步手段往往會導(dǎo)致線程在用戶態(tài)/內(nèi)核態(tài)多次切換,系統(tǒng)調(diào)用,線程切換都是不小的開銷。

在線程池技術(shù)中,提到了一個公共的任務(wù)隊列,各個工作線程需要從中提取任務(wù)進(jìn)行處理,這里就涉及到多個工作線程對這個公共隊列的同步操作。


有沒有一些輕量級的方案來實現(xiàn)多線程安全的訪問數(shù)據(jù)呢?這個時候,你需要:

無鎖編程技術(shù)

多線程并發(fā)編程中,遇到公共數(shù)據(jù)時就需要進(jìn)行線程同步。而這里的同步又可以分為阻塞型同步非阻塞型同步。

阻塞型同步好理解,我們常用的互斥體、信號、條件變量等這些操作系統(tǒng)提供的機制都屬于阻塞型同步,其本質(zhì)都是要加“鎖”。

10大高性能開發(fā)寶石,我要消滅一半程序員!

與之對應(yīng)的非阻塞型同步就是在無鎖的情況下實現(xiàn)同步,目前有三類技術(shù)方案:

  • Wait-free
  • Lock-free
  • Obstruction-free

三類技術(shù)方案都是通過一定的算法和技術(shù)手段來實現(xiàn)不用阻塞等待而實現(xiàn)同步,這其中又以Lock-free最為應(yīng)用廣泛。

Lock-free能夠廣泛應(yīng)用得益于目前主流的CPU都提供了原子級別的read-modify-write原語,這就是著名的CAS(Compare-And-Swap)操作。在Intel x86系列處理器上,就是cmpxchg系列指令。

//?通過CAS操作實現(xiàn)Lock-free
do?{
??...
}?while(!CAS(ptr,old_data,new_data?))

我們常常見到的無鎖隊列、無鎖鏈表、無鎖HashMap等數(shù)據(jù)結(jié)構(gòu),其無鎖的核心大都來源于此。在日常開發(fā)中,恰當(dāng)?shù)倪\用無鎖化編程技術(shù),可以有效地降低多線程阻塞和切換帶來的額外開銷,提升性能。


服務(wù)器上線了一段時間,發(fā)現(xiàn)服務(wù)經(jīng)常崩潰異常,排查發(fā)現(xiàn)是工作線程代碼bug,一崩潰整個服務(wù)都不可用了。于是你決定把工作線程和主線程拆開到不同的進(jìn)程中,工作線程崩潰不能影響整體的服務(wù)。這個時候出現(xiàn)了多進(jìn)程,你需要:

進(jìn)程間通信技術(shù)

提起進(jìn)程間通信,你能想到的是什么?

  • 管道
  • 命名管道
  • socket
  • 消息隊列
  • 信號
  • 信號量
  • 共享內(nèi)存

以上各種進(jìn)程間通信的方式詳細(xì)介紹和比較,推薦一篇文章一文掌握進(jìn)程間通信,這里不再贅述。

對于本地進(jìn)程間需要高頻次的大量數(shù)據(jù)交互,首推共享內(nèi)存這種方案。

現(xiàn)代操作系統(tǒng)普遍采用了基于虛擬內(nèi)存的管理方案,在這種內(nèi)存管理方式之下,各個進(jìn)程之間進(jìn)行了強制隔離。程序代碼中使用的內(nèi)存地址均是一個虛擬地址,由操作系統(tǒng)的內(nèi)存管理算法提前分配映射到對應(yīng)的物理內(nèi)存頁面,CPU在執(zhí)行代碼指令時,對訪問到的內(nèi)存地址再進(jìn)行實時的轉(zhuǎn)換翻譯。

10大高性能開發(fā)寶石,我要消滅一半程序員!

從上圖可以看出,不同進(jìn)程之中,雖然是同一個內(nèi)存地址,最終在操作系統(tǒng)和CPU的配合下,實際存儲數(shù)據(jù)的內(nèi)存頁面卻是不同的。

而共享內(nèi)存這種進(jìn)程間通信方案的核心在于:如果讓同一個物理內(nèi)存頁面映射到兩個進(jìn)程地址空間中,雙方不是就可以直接讀寫,而無需拷貝了嗎?

10大高性能開發(fā)寶石,我要消滅一半程序員!

當(dāng)然,共享內(nèi)存只是最終的數(shù)據(jù)傳輸載體,雙方要實現(xiàn)通信還得借助信號、信號量等其他通知機制。

用上了高性能的共享內(nèi)存通信機制,多個服務(wù)進(jìn)程之間就可以愉快的工作了,即便有工作進(jìn)程出現(xiàn)Crash,整個服務(wù)也不至于癱瘓。


不久,老板增加需求了,不再滿足于只能提供靜態(tài)網(wǎng)頁瀏覽了,需要能夠?qū)崿F(xiàn)動態(tài)交互。這一次老板還算良心,給你加了一臺硬件服務(wù)器。

于是你用Java/PHP/Python等語言搞了一套web開發(fā)框架,單獨起了一個服務(wù),用來提供動態(tài)網(wǎng)頁支持,和原來等靜態(tài)內(nèi)容服務(wù)器配合工作。

這個時候你發(fā)現(xiàn),靜態(tài)服務(wù)和動態(tài)服務(wù)之間經(jīng)常需要通信。

一開始你用基于HTTP的RESTful接口在服務(wù)器之間通信,后來發(fā)現(xiàn)用JSON格式傳輸數(shù)據(jù)效率低下,你需要更高效的通信方案。

這個時候你需要:

RPC && 序列化技術(shù)

什么是RPC技術(shù)?

RPC全稱Remote Procedure Call,遠(yuǎn)程過程調(diào)用。我們平時編程中,隨時都在調(diào)用函數(shù),這些函數(shù)基本上都位于本地,也就是當(dāng)前進(jìn)程某一個位置的代碼塊。但如果要調(diào)用的函數(shù)不在本地,而在網(wǎng)絡(luò)上的某個服務(wù)器上呢?這就是遠(yuǎn)程過程調(diào)用的來源。

10大高性能開發(fā)寶石,我要消滅一半程序員!

從圖中可以看出,通過網(wǎng)絡(luò)進(jìn)行功能調(diào)用,涉及參數(shù)的打包解包、網(wǎng)絡(luò)的傳輸、結(jié)果的打包解包等工作。而其中對數(shù)據(jù)進(jìn)行打包和解包就需要依賴序列化技術(shù)來完成。

什么是序列化技術(shù)?

10大高性能開發(fā)寶石,我要消滅一半程序員!

序列化簡單來說,是將內(nèi)存中的對象轉(zhuǎn)換成可以傳輸和存儲的數(shù)據(jù),而這個過程的逆向操作就是反序列化。序列化 && 反序列化技術(shù)可以實現(xiàn)將內(nèi)存對象在本地和遠(yuǎn)程計算機上搬運。好比把大象關(guān)進(jìn)冰箱門分三步:

  • 將本地內(nèi)存對象編碼成數(shù)據(jù)流
  • 通過網(wǎng)絡(luò)傳輸上述數(shù)據(jù)流
  • 將收到的數(shù)據(jù)流在內(nèi)存中構(gòu)建出對象

序列化技術(shù)有很多免費開源的框架,衡量一個序列化框架的指標(biāo)有這么幾個:

  • 是否支持跨語言使用,能支持哪些語言
  • 是否只是單純的序列化功能,包不包含RPC框架
  • 序列化傳輸性能
  • 擴(kuò)展支持能力(數(shù)據(jù)對象增刪字段后,前后的兼容性)
  • 是否支持動態(tài)解析(動態(tài)解析是指不需要提前編譯,根據(jù)拿到的數(shù)據(jù)格式定義文件立即就能解析)

下面流行的三大序列化框架protobuf、thrift、avro的對比:

ProtoBuf:

廠商:Google

支持語言:C++、Java、Python等

動態(tài)性支持:較差,一般需要提前編譯

是否包含RPC:否

簡介:ProtoBuf是谷歌出品的序列化框架,成熟穩(wěn)定,性能強勁,很多大廠都在使用。自身只是一個序列化框架,不包含RPC功能,不過可以與同是Google出品的GPRC框架一起配套使用,作為后端RPC服務(wù)開發(fā)的黃金搭檔。

10大高性能開發(fā)寶石,我要消滅一半程序員!

缺點是對動態(tài)性支持較弱,不過在更新版本中這一現(xiàn)象有待改善??傮w來說,ProtoBuf都是一款非常值得推薦的序列化框架。

Thrift

廠商:Facebook

支持語言:C++、Java、Python、PHP、C#、Go、JavaScript等

動態(tài)性支持:差

是否包含RPC:是

簡介:這是一個由Facebook出品的RPC框架,本身內(nèi)含二進(jìn)制序列化方案,但Thrift本身的RPC和數(shù)據(jù)序列化是解耦的,你甚至可以選擇XML、JSON等自定義的數(shù)據(jù)格式。在國內(nèi)同樣有一批大廠在使用,性能方面和ProtoBuf不分伯仲。缺點和ProtoBuf一樣,對動態(tài)解析的支持不太友好。

Avro

支持語言:C、C++、Java、Python、C#等

動態(tài)性支持:好

是否包含RPC:是

簡介:這是一個源自于Hadoop生態(tài)中的序列化框架,自帶RPC框架,也可獨立使用。相比前兩位最大的優(yōu)勢就是支持動態(tài)數(shù)據(jù)解析。

10大高性能開發(fā)寶石,我要消滅一半程序員!

為什么我一直在說這個動態(tài)解析功能呢?在之前的一段項目經(jīng)歷中,軒轅就遇到了三種技術(shù)的選型,擺在我們面前的就是這三種方案。需要一個C++開發(fā)的服務(wù)和一個Java開發(fā)的服務(wù)能夠進(jìn)行RPC。

Protobuf和Thrift都需要通過“編譯”將對應(yīng)的數(shù)據(jù)協(xié)議定義文件編譯成對應(yīng)的C++/Java源代碼,然后合入項目中一起編譯,從而進(jìn)行解析。

當(dāng)時,Java項目組同學(xué)非常強硬的拒絕了這一做法,其理由是這樣編譯出來的強業(yè)務(wù)型代碼融入他們的業(yè)務(wù)無關(guān)的框架服務(wù),而業(yè)務(wù)是常變的,這樣做不夠優(yōu)雅。

最后,經(jīng)過測試,最終選擇了AVRO作為我們的方案。Java一側(cè)只需要動態(tài)加載對應(yīng)的數(shù)據(jù)格式文件,就能對拿到的數(shù)據(jù)進(jìn)行解析,并且性能上還不錯。(當(dāng)然,對于C++一側(cè)還是選擇了提前編譯的做法)


自從你的網(wǎng)站支持了動態(tài)能力,免不了要和數(shù)據(jù)庫打交道,但隨著用戶的增長,你發(fā)現(xiàn)數(shù)據(jù)庫的查詢速度越來越慢。

這個時候,你需要:

數(shù)據(jù)庫索引技術(shù)

想想你手上有一本數(shù)學(xué)教材,但是目錄被人給撕掉了,現(xiàn)在要你翻到講三角函數(shù)的那一頁,你該怎么辦?

沒有了目錄,你只有兩種辦法,要么一頁一頁的翻,要么隨機翻,直到找到三角函數(shù)的那一頁。

對于數(shù)據(jù)庫也是一樣的道理,如果我們的數(shù)據(jù)表沒有“目錄”,那要查詢滿足條件的記錄行,就得全表掃描,那可就惱火了。所以為了加快查詢速度,得給數(shù)據(jù)表也設(shè)置目錄,在數(shù)據(jù)庫領(lǐng)域中,這就是索引。

一般情況下,數(shù)據(jù)表都會有多個字段,那根據(jù)不同的字段也就可以設(shè)立不同的索引。

索引的分類

  • 主鍵索引
  • 聚集索引
  • 非聚集索引

主鍵我們都知道,是唯一標(biāo)識一條數(shù)據(jù)記錄的字段(也存在多個字段一起來唯一標(biāo)識數(shù)據(jù)記錄的聯(lián)合主鍵),那與之對應(yīng)的就是主鍵索引了。

聚集索引是指索引的邏輯順序與表記錄的物理存儲順序一致的索引,一般情況下主鍵索引就符合這個定義,所以一般來說主鍵索引也是聚集索引。但是,這不是絕對的,在不同的數(shù)據(jù)庫中,或者在同一個數(shù)據(jù)庫下的不同存儲引擎中還是有不同。

聚集索引的葉子節(jié)點直接存儲了數(shù)據(jù),也是數(shù)據(jù)節(jié)點,而非聚集索引的葉子節(jié)點沒有存儲實際的數(shù)據(jù),需要二次查詢。

索引的實現(xiàn)原理

索引的實現(xiàn)主要有三種:

  • B+樹
  • 哈希表
  • 位圖

其中,B+樹用的最多,其特點是樹的節(jié)點眾多,相較于二叉樹,這是一棵多叉樹,是一個扁平的胖樹,減少樹的深度有利于減少磁盤I/O次數(shù),適宜數(shù)據(jù)庫的存儲特點。

10大高性能開發(fā)寶石,我要消滅一半程序員!

哈希表實現(xiàn)的索引也叫散列索引,通過哈希函數(shù)來實現(xiàn)數(shù)據(jù)的定位。哈希算法的特點是速度快,常數(shù)階的時間復(fù)雜度,但缺點是只適合準(zhǔn)確匹配,不適合模糊匹配和范圍搜索。

10大高性能開發(fā)寶石,我要消滅一半程序員!

位圖索引相對就少見了。想象這么一個場景,如果某個字段的取值只有有限的少數(shù)幾種可能,比如性別、省份、血型等等,針對這樣的字段如果用B+樹作為索引的話會出現(xiàn)什么情況?會出現(xiàn)大量索引值相同的葉子節(jié)點,這實際上是一種存儲浪費。

位圖索引正是基于這一點進(jìn)行優(yōu)化,針對字段取值只有少量有限項,數(shù)據(jù)表中該列字段出現(xiàn)大量重復(fù)時,就是位圖索引一展身手的時機。

所謂位圖,就是Bitmap,其基本思想是對該字段每一個取值建立一個二進(jìn)制位圖來標(biāo)記數(shù)據(jù)表的每一條記錄的該列字段是否是對應(yīng)取值。

10大高性能開發(fā)寶石,我要消滅一半程序員!

索引雖好,但也不可濫用,一方面索引最終是要存儲到磁盤上的,無疑會增加存儲開銷。另外更重要的是,數(shù)據(jù)表的增刪操作一般會伴隨對索引的更新,因此對數(shù)據(jù)庫的寫入速度也是會有一定影響。


你的網(wǎng)站現(xiàn)在訪問量越來越大了,同時在線人數(shù)大大增長。然而,大量用戶的請求帶來了后端程序?qū)?shù)據(jù)庫大量的訪問。漸漸的,數(shù)據(jù)庫的瓶頸開始出現(xiàn),無法再支持日益增長的用戶量。老板再一次給你下達(dá)了性能提升的任務(wù)。

緩存技術(shù) && 布隆過濾器

從物理CPU對內(nèi)存數(shù)據(jù)的緩存到瀏覽器對網(wǎng)頁內(nèi)容的緩存,緩存技術(shù)遍布于計算機世界的每一個角落。

面對當(dāng)前出現(xiàn)的數(shù)據(jù)庫瓶頸,同樣可以用緩存技術(shù)來解決。

每次訪問數(shù)據(jù)庫都需要數(shù)據(jù)庫進(jìn)行查表(當(dāng)然,數(shù)據(jù)庫自身也有優(yōu)化措施),反映到底層就是進(jìn)行一次或多次的磁盤I/O,但凡涉及I/O的就會慢下來。如果是一些頻繁用到但又不會經(jīng)常變化的數(shù)據(jù),何不將其緩存在內(nèi)存中,不必每一次都要找數(shù)據(jù)庫要,從而減輕對數(shù)據(jù)庫對壓力呢?

10大高性能開發(fā)寶石,我要消滅一半程序員!

有需求就有市場,有市場就會有產(chǎn)品,以memcachedRedis為代表的內(nèi)存對象緩存系統(tǒng)應(yīng)運而生。

緩存系統(tǒng)有三個著名的問題:

  • 緩存穿透: 緩存設(shè)立的目的是為了一定層面上截獲到數(shù)據(jù)庫存儲層的請求。穿透的意思就在于這個截獲沒有成功,請求最終還是去到了數(shù)據(jù)庫,緩存沒有產(chǎn)生應(yīng)有的價值。

  • 緩存擊穿: 如果把緩存理解成一面擋在數(shù)據(jù)庫面前的墻壁,為數(shù)據(jù)庫“抵御”查詢請求,所謂擊穿,就是在這面墻壁上打出了一個洞。一般發(fā)生在某個熱點數(shù)據(jù)緩存到期,而此時針對該數(shù)據(jù)的大量查詢請求來臨,大家一股腦的懟到了數(shù)據(jù)庫。

  • 緩存雪崩: 理解了擊穿,那雪崩就更好理解了。俗話說得好,擊穿是一個人的雪崩,雪崩是一群人的擊穿。如果緩存這堵墻上處處都是洞,那這面墻還如何屹立?吃棗藥丸。

關(guān)于這三個問題的更詳細(xì)闡述,推薦一篇文章什么是緩存系統(tǒng)的三座大山。

有了緩存系統(tǒng),我們就可以在向數(shù)據(jù)庫請求之前,先詢問緩存系統(tǒng)是否有我們需要的數(shù)據(jù),如果有且滿足需要,我們就可以省去一次數(shù)據(jù)庫的查詢,如果沒有,我們再向數(shù)據(jù)庫請求。

注意,這里有一個關(guān)鍵的問題,如何判斷我們要的數(shù)據(jù)是不是在緩存系統(tǒng)中呢?

進(jìn)一步,我們把這個問題抽象出來:如何快速判斷一個數(shù)據(jù)量很大的集合中是否包含我們指定的數(shù)據(jù)?

10大高性能開發(fā)寶石,我要消滅一半程序員!

這個時候,就是布隆過濾器大顯身手的時候了,它就是為了解決這個問題而誕生的。那布隆過濾器是如何解決這個問題的呢?

先回到上面的問題中來,這其實是一個查找問題,對于查找問題,最常用的解決方案是搜索樹和哈希表兩種方案。

因為這個問題有兩個關(guān)鍵點:快速、數(shù)據(jù)量很大。樹結(jié)構(gòu)首先得排除,哈希表倒是可以做到常數(shù)階的性能,但數(shù)據(jù)量大了以后,一方面對哈希表的容量要求巨大,另一方面如何設(shè)計一個好的哈希算法能夠做到如此大量數(shù)據(jù)的哈希映射也是一個難題。

對于容量的問題,考慮到只需要判斷對象是否存在,而并非拿到對象,我們可以將哈希表的表項大小設(shè)置為1個bit,1表示存在,0表示不存在,這樣大大縮小哈希表的容量。

而對于哈希算法的問題,如果我們對哈希算法要求低一些,那哈希碰撞的機率就會增加。那一個哈希算法容易沖突,那就多弄幾個,多個哈希函數(shù)同時沖突的概率就小的多。

布隆過濾器就是基于這樣的設(shè)計思路:

10大高性能開發(fā)寶石,我要消滅一半程序員!

當(dāng)設(shè)置對應(yīng)的key-value時,按照一組哈希算法的計算,將對應(yīng)比特位置1。

但當(dāng)對應(yīng)的key-value刪除時,卻不能將對應(yīng)的比特位置0,因為保不準(zhǔn)其他某個key的某個哈希算法也映射到了同一個位置。

也正是因為這樣,引出了布隆過濾器的另外一個重要特點:布隆過濾器判定存在的實際上不一定存在,但判定不存在的則一定不存在。


你們公司網(wǎng)站的內(nèi)容越來越多了,用戶對于快速全站搜索的需求日益強烈。這個時候,你需要:

全文搜索技術(shù)

對于一些簡單的查詢需求,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫尚且可以應(yīng)付。但搜索需求一旦變得復(fù)雜起來,比如根據(jù)文章內(nèi)容關(guān)鍵字、多個搜索條件但邏輯組合等情況下,數(shù)據(jù)庫就捉襟見肘了,這個時候就需要單獨的索引系統(tǒng)來進(jìn)行支持。

10大高性能開發(fā)寶石,我要消滅一半程序員!

如今行業(yè)內(nèi)廣泛使用的ElasticSearch(簡稱ES)就是一套強大的搜索引擎。集全文檢索、數(shù)據(jù)分析、分布式部署等優(yōu)點于一身,成為企業(yè)級搜索技術(shù)的首選。

10大高性能開發(fā)寶石,我要消滅一半程序員!

ES使用RESTful接口,使用JSON作為數(shù)據(jù)傳輸格式,支持多種查詢匹配,為各主流語言都提供了SDK,易于上手。

另外,ES常常和另外兩個開源軟件Logstash、Kibana一起,形成一套日志收集、分析、展示的完整解決方案:ELK架構(gòu)。

10大高性能開發(fā)寶石,我要消滅一半程序員!

其中,Logstash負(fù)責(zé)數(shù)據(jù)的收集、解析,ElasticSearch負(fù)責(zé)搜索,Kibana負(fù)責(zé)可視化交互,成為不少企業(yè)級日志分析管理的鐵三角。


無論我們怎么優(yōu)化,一臺服務(wù)器的力量終究是有限的。公司業(yè)務(wù)發(fā)展迅猛,原來的服務(wù)器已經(jīng)不堪重負(fù),于是公司采購了多臺服務(wù)器,將原有的服務(wù)都部署了多份,以應(yīng)對日益增長的業(yè)務(wù)需求。

現(xiàn)在,同一個服務(wù)有多個服務(wù)器在提供服務(wù)了,需要將用戶的請求均衡的分?jǐn)偟礁鱾€服務(wù)器上,這個時候,你需要:

負(fù)載均衡技術(shù)

顧名思義,負(fù)載均衡意為將負(fù)載均勻平衡分配到多個業(yè)務(wù)節(jié)點上去。

10大高性能開發(fā)寶石,我要消滅一半程序員!

和緩存技術(shù)一樣,負(fù)載均衡技術(shù)同樣存在于計算機世界到各個角落。

按照均衡實現(xiàn)實體,可以分為軟件負(fù)載均衡(如LVS、Nginx、HAProxy)和硬件負(fù)載均衡(如A10、F5)。

按照網(wǎng)絡(luò)層次,可以分為四層負(fù)載均衡(基于網(wǎng)絡(luò)連接)和七層負(fù)載均衡(基于應(yīng)用內(nèi)容)。

按照均衡策略算法,可以分為輪詢均衡、哈希均衡、權(quán)重均衡、隨機均衡或者這幾種算法相結(jié)合的均衡。

而對于現(xiàn)在遇到等問題,可以使用nginx來實現(xiàn)負(fù)載均衡,nginx支持輪詢、權(quán)重、IP哈希、最少連接數(shù)目、最短響應(yīng)時間等多種方式的負(fù)載均衡配置。

輪詢

upstream?web-server?{
????server?192.168.1.100;
????server?192.168.1.101;
}

權(quán)重

upstream?web-server?{
????server?192.168.1.100?weight=1;
????server?192.168.1.101?weight=2;
}

IP哈希值

upstream?web-server?{
????ip_hash;
????server?192.168.1.100?weight=1;
????server?192.168.1.101?weight=2;
}

最少連接數(shù)目

upstream?web-server?{
????least_conn;
????server?192.168.1.100?weight=1;
????server?192.168.1.101?weight=2;
}

最短響應(yīng)時間

upstream?web-server?{
????server?192.168.1.100?weight=1;
????server?192.168.1.101?weight=2;
????fair;??
}

總結(jié)

高性能是一個永恒的話題,其涉及的技術(shù)和知識面其實遠(yuǎn)不止上面列出的這些。

從物理硬件CPU、內(nèi)存、硬盤、網(wǎng)卡到軟件層面的通信、緩存、算法、架構(gòu)每一個環(huán)節(jié)的優(yōu)化都是通往高性能的道路。

路漫漫其修遠(yuǎn)兮,吾將上下而求索。

特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

10大高性能開發(fā)寶石,我要消滅一半程序員!

10大高性能開發(fā)寶石,我要消滅一半程序員!

10大高性能開發(fā)寶石,我要消滅一半程序員!

長按訂閱更多精彩▼

10大高性能開發(fā)寶石,我要消滅一半程序員!

如有收獲,點個在看,誠摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉