首選,如果之前使用過redis容器,我們輪慧需要先remove掉之前的容器
創(chuàng)新互聯(lián)為企業(yè)級客戶提高一站式互聯(lián)網(wǎng)+設(shè)計服務(wù),主要包括成都網(wǎng)站建設(shè)、做網(wǎng)站、手機APP定制開發(fā)、微信小程序開發(fā)、宣傳片制作、LOGO設(shè)計等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗豐富的經(jīng)驗,可以確保每一個作品的質(zhì)量和創(chuàng)作周期,同時每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。
然后創(chuàng)建redis容器,并運行
進入redis容器中
接著我們通過 redis-cli 連接測衡桐譽試使用 redis 服務(wù)
setex指令 可以設(shè)置數(shù)據(jù)存在的時間, setex key second value
MSET 一次設(shè)置多個key-value
MGET一次獲取多個key-value
HGET
HGETALL
Hlen和hexist
Lpush 和 Lrange
Lpop和Rpop 從鏈表取出并移走數(shù)據(jù)
刪除鏈表所咐段有數(shù)據(jù) DEL
字符串無序 不能重復(fù)
從連接池中Get出一個conn連接
安裝:
go get -v -u github點抗 /rocket049/connpool
go get -v -u gitee點抗 /rocket049/connpool
rocket049/connpool 包是本人用go語言開發(fā)的,提供一個通畝鬧用的TCP連李段接池,初始化參數(shù)包括最高連接數(shù)、超時秒數(shù)、連接函數(shù),放回連接池的連接被重新取出時,如果已經(jīng)超時,將會哪耐譽自動重新連接;如果沒有超時,連接將被復(fù)用。
可調(diào)用的函數(shù):
調(diào)用示例:
之前寫過了Go語言gorm框架MySQL實踐,其中對gorm框架在操作MySQL的各種基礎(chǔ)實踐,下面分享一下如型塌何使用gorm框架對MySQL直接進行性能測試的簡單實踐。
這里我使用了一個原始的Go語言版本的 FunTester 測試框架,現(xiàn)在只有一個基本的方法,實在是因為Go語言特性太強了。框架設(shè)計的主要思路之一就是利用Go語言的閉包和方法參數(shù)特性,將一個 func() 當(dāng)做性能測試的主題,通過不斷運行這個 func() 來實現(xiàn)性能測試。當(dāng)然還有另外一個思路就是運行一個多線程任務(wù)類,類似 Java 版本的 com.funtester.base.constaint.ThreadBase 抽象類,這樣可以設(shè)置一些類的屬性,綁定一些測試資源,適配更多的測試場景。
下面演示select的性能測試,這里我用了隨機ID查詢的場景。
這里我使用從35開始遞增的ID進行刪除。
這里使用了select的用例部分,隨機ID,然后更新name字段,隨機10個長度的字符串。
這里用到了 FunTester 字段都是隨機生成。
到這里可以看出,性能測試框架用到的都是gorm框架的基礎(chǔ)API使用,這里MySQL連接池的管理工作完全交給了gorm框架完成,看資料說非常牛逼,我們只需要設(shè)置幾個參凳顫數(shù)。這個使用體現(xiàn)很像 HttpClient 設(shè)置 HTTP 連接池類似,這里我們也可以看出這些優(yōu)秀的框架使用起來都是非常卜粗圓簡單的。
PS:關(guān)于gorm的基礎(chǔ)使用的請參考上一期的文章Go語言gorm框架MySQL實踐。
有很多教程是關(guān)于Go的sql.DB類型和如何使用它來執(zhí)行SQL數(shù)據(jù)庫查詢的。但大多數(shù)內(nèi)容都沒有講述 SetMaxOpenConns() , SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它們來配置sql.DB的行為并改變其性能。
轉(zhuǎn)自:
整理:go語言中文文檔:
在本文我將詳細解釋這些設(shè)置的作用,并說明它們所能產(chǎn)生的(積極和消極)影響。
一個sql.DB對象就是一個數(shù)據(jù)庫連接池,它包含“正在用”和“空閑的”連接。一個正在用的連接指的是,你正用它來執(zhí)行數(shù)據(jù)庫任務(wù),例如執(zhí)行SQL語句或行查詢。當(dāng)任務(wù)完成連接就是空閑的。
當(dāng)您創(chuàng)建sql.DB執(zhí)行數(shù)據(jù)庫任務(wù)時,它將首先檢查連消緩接池中是否有可用的空閑連接。如果有可用的連接,那么Go將重用現(xiàn)有連接,并在執(zhí)行任務(wù)期間將其標(biāo)記為正在使用。如果池中沒有空閑連接,而您需要一個空閑連接,那么Go將創(chuàng)建一個新的連接。
默認情況下,在同一時間打開連接的數(shù)量是沒有限制(包含使用中+空閑)。但你可以通過SetMaxOpenConns()方法實現(xiàn)自定義限制,如下所示:
在這個示例代碼中,連接池現(xiàn)在有5個并發(fā)打開的連接數(shù)。如果所有5個連接都已經(jīng)被標(biāo)記為正在使用,租橋野并且需要另一個新的連接,那么應(yīng)用程序?qū)⒈黄鹊却钡?個連接中的一個被釋放并變?yōu)榭臻e。
為了弊喊說明更改MaxOpenConns的影響,我運行了一個基準(zhǔn)測試,將最大打開連接數(shù)設(shè)置為1、2、5、10和無限。基準(zhǔn)測試在PostgreSQL數(shù)據(jù)庫上執(zhí)行并行的INSERT語句,您可以在這里找到代碼。測試結(jié)果:
對于這個基準(zhǔn)測試,我們可以看到,允許打開的連接越多,在數(shù)據(jù)庫上執(zhí)行INSERT操作所花費的時間就越少(打開的連接數(shù)為1時,執(zhí)行速度3129633ns/op,而無限連接:531030ns/op——大約快了6倍)。這是因為允許打開的連接越多,可以并發(fā)執(zhí)行的數(shù)據(jù)庫查詢就越多。
默認情況下,sql.DB允許連接池中最多保留2個空閑連接。你可以通過SetMaxIdleConns()方法改變它,如下所示:
從理論上講,允許池中有更多的空閑連接將提高性能,因為這樣就不太可能從頭開始建立新連接——因此有助于提升數(shù)據(jù)庫性能。
讓我們來看看相同的基準(zhǔn)測試,最大空閑連接設(shè)置為none, 1,2,5和10:
當(dāng)MaxIdleConns設(shè)置為none時,必須為每個INSERT從頭創(chuàng)建一個新的連接,我們可以從基準(zhǔn)測試中看到,平均運行時和內(nèi)存使用量相對較高。
只允許保留和重用一個空閑連接對基準(zhǔn)測試影響特別明顯——它將平均運行時間減少了大約8倍,內(nèi)存使用量減少了大約20倍。繼續(xù)增加空閑連接池的大小會使性能變得更好,盡管改進并不明顯。
那么,您應(yīng)該維護一個大的空閑連接池嗎?答案取決于應(yīng)用程序。重要的是要意識到保持空閑連接是有代價的—它占用了可以用于應(yīng)用程序和數(shù)據(jù)庫的內(nèi)存。
還有一種可能是,如果一個連接空閑時間太長,那么它可能會變得不可用。例如,MySQL的wait_timeout設(shè)置將自動關(guān)閉任何8小時(默認)內(nèi)未使用的連接。
當(dāng)發(fā)生這種情況時,sql.DB會優(yōu)雅地處理它。壞連接將自動重試兩次,然后放棄,此時Go將該連接從連接池中刪除,并創(chuàng)建一個新的連接。因此,將MaxIdleConns設(shè)置得太大可能會導(dǎo)致連接變得不可用,與空閑連接池更小(使用更頻繁的連接更少)相比,會占有更多的資源。所以,如果你很可能很快就會再次使用,你只需保持一個空閑的連接。
最后要指出的是,MaxIdleConns應(yīng)該總是小于或等于MaxOpenConns。Go強制執(zhí)行此操作,并在必要時自動減少MaxIdleConns。
現(xiàn)在讓我們看看SetConnMaxLifetime()方法,它設(shè)置連接可重用的最大時間長度。如果您的SQL數(shù)據(jù)庫也實現(xiàn)了最大連接生命周期,或者—例如—您希望方便地在負載均衡器后交換數(shù)據(jù)庫,那么這將非常有用。
你可以這樣使用它:
在這個例子中,所有的連接都將在創(chuàng)建后1小時“過期”,并且在過期后無法重用。但注意:
從理論上講,ConnMaxLifetime越短,連接過期的頻率就越高——因此,需要從頭創(chuàng)建連接的頻率就越高。為了說明這一點,我運行了將ConnMaxLifetime設(shè)置為100ms、200ms、500ms、1000ms和無限(永遠重用)的基準(zhǔn)測試,默認設(shè)置為無限打開連接和2個空閑連接。這些時間段顯然比您在大多數(shù)應(yīng)用程序中使用的時間要短得多,但它們有助于很好地說明行為。
在這些特定的基準(zhǔn)測試中,我們可以看到,與無限生存期相比,在100ms生存期時內(nèi)存使用量增加了3倍以上,而且每個INSERT的平均運行時也稍微長一些。
如果您在代碼中設(shè)置了ConnMaxLifetime,那么一定要記住連接將過期(隨后重新創(chuàng)建)的頻率。例如,如果您總共有100個連接,而ConnMaxLifetime為1分鐘,那么您的應(yīng)用程序可能每秒鐘殺死和重新創(chuàng)建1.67個連接(平均值)。您不希望這個頻率太大,最終會阻礙性能,而不是提高性能。
最后,如果不說明超過數(shù)據(jù)庫連接數(shù)量的硬限制將會發(fā)生什么,那么本文就不完整了。 為了說明這一點,我將修改postgresql.conf文件,這樣總共只允許5個連接(默認是100個)…
然后在無限連接的情況下重新運行基準(zhǔn)測試……
一旦達到5個連接的硬限制,數(shù)據(jù)庫驅(qū)動程序(pq)立即返回一個太多客戶端連接的錯誤消息,而無法完成INSERT。為了防止這個錯誤,我們需要將sql.DB中打開連接的最大總數(shù)(正在使用的+空閑的)設(shè)置為低于5。像這樣:
現(xiàn)在,sql.DB在任何時候最多只能創(chuàng)建3個連接,基準(zhǔn)測試運行時應(yīng)該不會出現(xiàn)任何錯誤。但是這樣做需要注意:當(dāng)達到開放連接數(shù)限制,并且所有連接都在使用時,應(yīng)用程序需要執(zhí)行的任何新的數(shù)據(jù)庫任務(wù)都將被迫等待,直到連接標(biāo)記為空閑。例如,在web應(yīng)用程序的上下文中,用戶的HTTP請求看起來會“掛起”,甚至在等待數(shù)據(jù)庫任務(wù)運行時可能會超時。
為了減輕這種情況,你應(yīng)該始終在一個上下文中傳遞。在調(diào)用數(shù)據(jù)庫時,啟用上下文的方法(如ExecContext()),使用固定的、快速的超時上下文對象。
總結(jié)
1、根據(jù)經(jīng)驗,應(yīng)該顯式設(shè)置MaxOpenConns值。這應(yīng)該小于數(shù)據(jù)庫和基礎(chǔ)設(shè)施對連接數(shù)量的硬性限制。
2、一般來說,更高的MaxOpenConns和MaxIdleConns值將帶來更好的性能。但你應(yīng)該注意到效果是遞減的,連接池空閑連接太多(連接沒有被重用,最終會變壞)實際上會導(dǎo)致性能下降。
3、為了降低上面第2點帶來的風(fēng)險,您可能需要設(shè)置一個相對較短的ConnMaxLifetime。但你也不希望它太短,導(dǎo)致連接被殺死或不必要地頻繁重建。
4、MaxIdleConns應(yīng)該總是小于或等于MaxOpenConns。
對于中小型web應(yīng)用程序,我通常使用以下設(shè)置作為起點,然后根據(jù)實際吞吐量水平的負載測試結(jié)果進行優(yōu)化。
網(wǎng)站標(biāo)題:go語言+連接池 go實現(xiàn)連接池
分享路徑:http://www.chinadenli.net/article44/ddpishe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、商城網(wǎng)站、網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)站排名、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)