欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言高性能拼接,go語言高并發(fā)

go語言可以做什么

1、服務器編程:以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日志、數據打包、虛擬機處理、文件系統(tǒng)等。

創(chuàng)新互聯專業(yè)為企業(yè)提供北碚網站建設、北碚做網站、北碚網站設計、北碚網站制作等企業(yè)網站建設、網頁設計與制作、北碚企業(yè)網站模板建站服務,10余年北碚做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。

2、分布式系統(tǒng)、數據庫代理器、中間件:例如Etcd。

3、網絡編程:這一塊目前應用最廣,包括Web應用、API應用、下載應用,而且Go內置的net/http包基本上把我們平常用到的網絡功能都實現了。

4、開發(fā)云平臺:目前國外很多云平臺在采用Go開發(fā),我們所熟知的七牛云、華為云等等都有使用Go進行開發(fā)并且開源的成型的產品。

5、區(qū)塊鏈:目前有一種說法,技術從業(yè)人員把Go語言稱作為區(qū)塊鏈行業(yè)的開發(fā)語言。如果大家學習區(qū)塊鏈技術的話,就會發(fā)現現在有很多很多的區(qū)塊鏈的系統(tǒng)和應用都是采用Go進行開發(fā)的,比如ehtereum是目前知名度最大的公鏈,再比如fabric是目前最知名的聯盟鏈,兩者都有go語言的版本,且go-ehtereum還是以太坊官方推薦的版本。

自1.0版發(fā)布以來,go語言引起了眾多開發(fā)者的關注,并得到了廣泛的應用。go語言簡單、高效、并發(fā)的特點吸引了許多傳統(tǒng)的語言開發(fā)人員,其數量也在不斷增加。

使用 Go 語言開發(fā)的開源項目非常多。早期的 Go 語言開源項目只是通過 Go 語言與傳統(tǒng)項目進行C語言庫綁定實現,例如 Qt、Sqlite 等。

后期的很多項目都使用 Go 語言進行重新原生實現,這個過程相對于其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發(fā)項目的出現。

golang配制高性能sql.DB

有很多教程是關于Go的sql.DB類型和如何使用它來執(zhí)行SQL數據庫查詢的。但大多數內容都沒有講述 SetMaxOpenConns() , SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它們來配置sql.DB的行為并改變其性能。

轉自:

整理:go語言中文文檔:

在本文我將詳細解釋這些設置的作用,并說明它們所能產生的(積極和消極)影響。

一個sql.DB對象就是一個數據庫連接池,它包含“正在用”和“空閑的”連接。一個正在用的連接指的是,你正用它來執(zhí)行數據庫任務,例如執(zhí)行SQL語句或行查詢。當任務完成連接就是空閑的。

當您創(chuàng)建sql.DB執(zhí)行數據庫任務時,它將首先檢查連接池中是否有可用的空閑連接。如果有可用的連接,那么Go將重用現有連接,并在執(zhí)行任務期間將其標記為正在使用。如果池中沒有空閑連接,而您需要一個空閑連接,那么Go將創(chuàng)建一個新的連接。

默認情況下,在同一時間打開連接的數量是沒有限制(包含使用中+空閑)。但你可以通過SetMaxOpenConns()方法實現自定義限制,如下所示:

在這個示例代碼中,連接池現在有5個并發(fā)打開的連接數。如果所有5個連接都已經被標記為正在使用,并且需要另一個新的連接,那么應用程序將被迫等待,直到5個連接中的一個被釋放并變?yōu)榭臻e。

為了說明更改MaxOpenConns的影響,我運行了一個基準測試,將最大打開連接數設置為1、2、5、10和無限?;鶞蕼y試在PostgreSQL數據庫上執(zhí)行并行的INSERT語句,您可以在這里找到代碼。測試結果:

對于這個基準測試,我們可以看到,允許打開的連接越多,在數據庫上執(zhí)行INSERT操作所花費的時間就越少(打開的連接數為1時,執(zhí)行速度3129633ns/op,而無限連接:531030ns/op——大約快了6倍)。這是因為允許打開的連接越多,可以并發(fā)執(zhí)行的數據庫查詢就越多。

默認情況下,sql.DB允許連接池中最多保留2個空閑連接。你可以通過SetMaxIdleConns()方法改變它,如下所示:

從理論上講,允許池中有更多的空閑連接將提高性能,因為這樣就不太可能從頭開始建立新連接——因此有助于提升數據庫性能。

讓我們來看看相同的基準測試,最大空閑連接設置為none, 1,2,5和10:

當MaxIdleConns設置為none時,必須為每個INSERT從頭創(chuàng)建一個新的連接,我們可以從基準測試中看到,平均運行時和內存使用量相對較高。

只允許保留和重用一個空閑連接對基準測試影響特別明顯——它將平均運行時間減少了大約8倍,內存使用量減少了大約20倍。繼續(xù)增加空閑連接池的大小會使性能變得更好,盡管改進并不明顯。

那么,您應該維護一個大的空閑連接池嗎?答案取決于應用程序。重要的是要意識到保持空閑連接是有代價的—它占用了可以用于應用程序和數據庫的內存。

還有一種可能是,如果一個連接空閑時間太長,那么它可能會變得不可用。例如,MySQL的wait_timeout設置將自動關閉任何8小時(默認)內未使用的連接。

當發(fā)生這種情況時,sql.DB會優(yōu)雅地處理它。壞連接將自動重試兩次,然后放棄,此時Go將該連接從連接池中刪除,并創(chuàng)建一個新的連接。因此,將MaxIdleConns設置得太大可能會導致連接變得不可用,與空閑連接池更小(使用更頻繁的連接更少)相比,會占有更多的資源。所以,如果你很可能很快就會再次使用,你只需保持一個空閑的連接。

最后要指出的是,MaxIdleConns應該總是小于或等于MaxOpenConns。Go強制執(zhí)行此操作,并在必要時自動減少MaxIdleConns。

現在讓我們看看SetConnMaxLifetime()方法,它設置連接可重用的最大時間長度。如果您的SQL數據庫也實現了最大連接生命周期,或者—例如—您希望方便地在負載均衡器后交換數據庫,那么這將非常有用。

你可以這樣使用它:

在這個例子中,所有的連接都將在創(chuàng)建后1小時“過期”,并且在過期后無法重用。但注意:

從理論上講,ConnMaxLifetime越短,連接過期的頻率就越高——因此,需要從頭創(chuàng)建連接的頻率就越高。為了說明這一點,我運行了將ConnMaxLifetime設置為100ms、200ms、500ms、1000ms和無限(永遠重用)的基準測試,默認設置為無限打開連接和2個空閑連接。這些時間段顯然比您在大多數應用程序中使用的時間要短得多,但它們有助于很好地說明行為。

在這些特定的基準測試中,我們可以看到,與無限生存期相比,在100ms生存期時內存使用量增加了3倍以上,而且每個INSERT的平均運行時也稍微長一些。

如果您在代碼中設置了ConnMaxLifetime,那么一定要記住連接將過期(隨后重新創(chuàng)建)的頻率。例如,如果您總共有100個連接,而ConnMaxLifetime為1分鐘,那么您的應用程序可能每秒鐘殺死和重新創(chuàng)建1.67個連接(平均值)。您不希望這個頻率太大,最終會阻礙性能,而不是提高性能。

最后,如果不說明超過數據庫連接數量的硬限制將會發(fā)生什么,那么本文就不完整了。 為了說明這一點,我將修改postgresql.conf文件,這樣總共只允許5個連接(默認是100個)…

然后在無限連接的情況下重新運行基準測試……

一旦達到5個連接的硬限制,數據庫驅動程序(pq)立即返回一個太多客戶端連接的錯誤消息,而無法完成INSERT。為了防止這個錯誤,我們需要將sql.DB中打開連接的最大總數(正在使用的+空閑的)設置為低于5。像這樣:

現在,sql.DB在任何時候最多只能創(chuàng)建3個連接,基準測試運行時應該不會出現任何錯誤。但是這樣做需要注意:當達到開放連接數限制,并且所有連接都在使用時,應用程序需要執(zhí)行的任何新的數據庫任務都將被迫等待,直到連接標記為空閑。例如,在web應用程序的上下文中,用戶的HTTP請求看起來會“掛起”,甚至在等待數據庫任務運行時可能會超時。

為了減輕這種情況,你應該始終在一個上下文中傳遞。在調用數據庫時,啟用上下文的方法(如ExecContext()),使用固定的、快速的超時上下文對象。

總結

1、根據經驗,應該顯式設置MaxOpenConns值。這應該小于數據庫和基礎設施對連接數量的硬性限制。

2、一般來說,更高的MaxOpenConns和MaxIdleConns值將帶來更好的性能。但你應該注意到效果是遞減的,連接池空閑連接太多(連接沒有被重用,最終會變壞)實際上會導致性能下降。

3、為了降低上面第2點帶來的風險,您可能需要設置一個相對較短的ConnMaxLifetime。但你也不希望它太短,導致連接被殺死或不必要地頻繁重建。

4、MaxIdleConns應該總是小于或等于MaxOpenConns。

對于中小型web應用程序,我通常使用以下設置作為起點,然后根據實際吞吐量水平的負載測試結果進行優(yōu)化。

go語言string之Buffer與Builder

操作字符串離不開字符串的拼接,但是Go中string是只讀類型,大量字符串的拼接會造成性能問題。

拼接字符串,無外乎四種方式,采用“+”,“fmt.Sprintf()”,"bytes.Buffer","strings.Builder"

上面我們創(chuàng)建10萬字符串拼接的測試,可以發(fā)現"bytes.Buffer","strings.Builder"的性能最好,約是“+”的1000倍級別。

這是由于string是不可修改的,所以在使用“+”進行拼接字符串,每次都會產生申請空間,拼接,復制等操作,數據量大的情況下非常消耗資源和性能。而采用Buffer等方式,都是預先計算拼接字符串數組的總長度(如果可以知道長度),申請空間,底層是slice數組,可以以append的形式向后進行追加。最后在轉換為字符串。這申請了不斷申請空間的操作,也減少了空間的使用和拷貝的次數,自然性能也高不少。

bytes.buffer是一個緩沖byte類型的緩沖器存放著都是byte

是一個變長的 buffer,具有 Read 和Write 方法。 Buffer 的 零值 是一個 空的 buffer,但是可以使用,底層就是一個 []byte, 字節(jié)切片。

向Buffer中寫數據,可以看出Buffer中有個Grow函數用于對切片進行擴容。

從Buffer中讀取數據

strings.Builder的方法和bytes.Buffer的方法的命名幾乎一致。

但實現并不一致,Builder的Write方法直接將字符拼接slice數組后。

其沒有提供read方法,但提供了strings.Reader方式

Reader 結構:

Buffer:

Builder:

可以看出Buffer和Builder底層都是采用[]byte數組進行裝載數據。

先來說說Buffer:

創(chuàng)建好Buffer是一個empty的,off 用于指向讀寫的尾部。

在寫的時候,先判斷當前寫入字符串長度是否大于Buffer的容量,如果大于就調用grow進行擴容,擴容申請的長度為當前寫入字符串的長度。如果當前寫入字符串長度小于最小字節(jié)長度64,直接創(chuàng)建64長度的[]byte數組。如果申請的長度小于二分之一總容量減去當前字符總長度,說明存在很大一部分被使用但已讀,可以將未讀的數據滑動到數組頭。如果容量不足,擴展2*c + n 。

其String()方法就是將字節(jié)數組強轉為string

Builder是如何實現的。

Builder采用append的方式向字節(jié)數組后添加字符串。

從上面可以看出,[]byte的內存大小也是以倍數進行申請的,初始大小為 0,第一次為大于當前申請的最大 2 的指數,不夠進行翻倍.

可以看出如果舊容量小于1024進行翻倍,否則擴展四分之一。(2048 byte 后,申請策略的調整)。

其次String()方法與Buffer的string方法也有明顯區(qū)別。Buffer的string是一種強轉,我們知道在強轉的時候是需要進行申請空間,并拷貝的。而Builder只是指針的轉換。

這里我們解析一下 *(*string)(unsafe.Pointer(b.buf)) 這個語句的意思。

先來了解下unsafe.Pointer 的用法。

也就是說,unsafe.Pointer 可以轉換為任意類型,那么意味著,通過unsafe.Pointer媒介,程序繞過類型系統(tǒng),進行地址轉換而不是拷貝。

即*A = Pointer = *B

就像上面例子一樣,將字節(jié)數組轉為unsafe.Pointer類型,再轉為string類型,s和b中內容一樣,修改b,s也變了,說明b和s是同一個地址。但是對s重新賦值后,意味著s的地址指向了“WORLD”,它們所使用的內存空間不同了,所以s改變后,b并不會改變。

所以他們的區(qū)別就在于 bytes.Buffer 是重新申請了一塊空間,存放生成的string變量, 而strings.Builder直接將底層的[]byte轉換成了string類型返回了回來,去掉了申請空間的操作。

為什么要使用 Go 語言?Go 語言的優(yōu)勢在哪里

1、學習曲線

它包含了類C語法、GC內置和工程工具。這一點非常重要,因為Go語言容易學習,所以一個普通的大學生花一個星期就能寫出來可以上手的、高性能的應用。在國內大家都追求快,這也是為什么國內Go流行的原因之一。

2、效率

Go擁有接近C的運行效率和接近PHP的開發(fā)效率,這就很有利的支撐了上面大家追求快速的需求。

3、出身名門、血統(tǒng)純正

之所以說Go語言出身名門,是因為我們知道Go語言出自Google公司,這個公司在業(yè)界的知名度和實力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭霸的局面下推出新的編程語言,自然有它的戰(zhàn)略考慮。而且從Go語言的發(fā)展態(tài)勢來看,Google對它這個新的寵兒還是很看重的,Go自然有一個良好的發(fā)展前途。我們看看Go語言的主要創(chuàng)造者,血統(tǒng)純正這點就可見端倪了。

4、組合的思想、無侵入式的接口

Go語言可以說是開發(fā)效率和運行效率二者的完美融合,天生的并發(fā)編程支持。Go語言支持當前所有的編程范式,包括過程式編程、面向對象編程以及函數式編程。

5、強大的標準庫

這包括互聯網應用、系統(tǒng)編程和網絡編程。Go里面的標準庫基本上已經是非常穩(wěn)定,特別是我這里提到的三個,網絡層、系統(tǒng)層的庫非常實用。

6、部署方便

我相信這一點是很多人選擇Go的最大理由,因為部署太方便,所以現在也有很多人用Go開發(fā)運維程序。

7、簡單的并發(fā)

它包含降低心智的并發(fā)和簡易的數據同步,我覺得這是Go最大的特色。之所以寫正確的并發(fā)、容錯和可擴展的程序如此之難,是因為我們用了錯誤的工具和錯誤的抽象,Go可以說這一塊做的相當簡單。

8、穩(wěn)定性

Go擁有強大的編譯檢查、嚴格的編碼規(guī)范和完整的軟件生命周期工具,具有很強的穩(wěn)定性,穩(wěn)定壓倒一切。那么為什么Go相比于其他程序會更穩(wěn)定呢?這是因為Go提供了軟件生命周期的各個環(huán)節(jié)的工具,如go

tool、gofmt、go test。

如何用Go語言打造一個高性能MySQL Proxy

你搜一下kingshard這個插件,就是用go語言寫的MySQL插件。

可以支持分表,分庫。 在github上。

如何用Go語言打造一個高性能MySQLProxy

讀取配置文件并啟動,在配置文件中設置的監(jiān)聽端口監(jiān)聽客戶端請求。

收到客戶端連接請求后,啟動一個goroutine單獨處理該請求。

首選進行登錄驗證,驗證過程完全兼容MySQL認證協(xié)議,由于用戶名和密碼在配置文件中已經設置好,所以可以利用該信息驗證連接請求是否合法。?

當用戶名和密碼都正確時,轉入下面的步驟,否則返回出錯信息給客戶端。

認證通過后,客戶端發(fā)送SQL語句。

kingshard對客戶端發(fā)送過來的SQL語句,進行詞法和語義分析,識別出SQL的類型和生成SQL的路由計劃。如果有必要還會改寫SQL,然后轉發(fā)到相應的DB。也有可能不做詞法和語義分析直接轉發(fā)到相應的后端DB。如果轉發(fā)SQL是分表且跨多個DB,則每個DB對應啟動一個goroutine發(fā)送SQL和接收該DB返回的結果。

接收并合并結果,然后轉發(fā)給客戶端。

新聞標題:go語言高性能拼接,go語言高并發(fā)
網站地址:http://chinadenli.net/article8/hdocop.html

成都網站建設公司_創(chuàng)新互聯,為您提供域名注冊、動態(tài)網站、自適應網站、企業(yè)建站、ChatGPT、App開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

外貿網站制作