内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

go語言qps go語言為什么突然火了

go是啥 語言.

GO語言由Google公司開發(fā),并于2009年開源,對比Java、Python、C等語言,GO尤其擅長并發(fā)編程,性能堪比C語言,開發(fā)效率比肩Python,被譽(yù)為21世紀(jì)的C語言。GO語言在云計(jì)算、大數(shù)據(jù)、微服務(wù)、高并發(fā)領(lǐng)域,應(yīng)用非常廣泛。BAT大廠正在把GO作為新項(xiàng)目開發(fā)的首選語言。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括麗水網(wǎng)站建設(shè)、麗水網(wǎng)站制作、麗水網(wǎng)頁制作以及麗水網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,麗水網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到麗水省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

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

1. 保留但大幅度簡化指針

Go語言保留著C中值和指針的區(qū)別,但是對于指針繁瑣用法進(jìn)行了大量的簡化,引入引用的概念。所以在Go語言中,你幾乎不用擔(dān)心會因?yàn)橹苯硬僮鲀?nèi)寸而引起各式各樣的錯(cuò)誤。

2. 多參數(shù)返回

還記得在C里面為了回饋多個(gè)參數(shù),不得不開辟幾段指針傳到目標(biāo)函數(shù)中讓其操作么?在Go里面這是完全不必要的。而且多參數(shù)的支持讓Go無需使用繁瑣的exceptions體系,一個(gè)函數(shù)可以返回期待的返回值加上error,調(diào)用函數(shù)后立刻處理錯(cuò)誤信息,清晰明了。

3. Array,slice,map等內(nèi)置基本數(shù)據(jù)結(jié)構(gòu)

如果你習(xí)慣了Python中簡潔的list和dict操作,在Go語言中,你不會感到孤單。一切都是那么熟悉,而且更加高效。如果你是C++程序員,你會發(fā)現(xiàn)你又找到了STL的vector 和 map這對朋友。

4. Interface

Go語言最讓人贊嘆不易的特性,就是interface的設(shè)計(jì)。任何數(shù)據(jù)結(jié)構(gòu),只要實(shí)現(xiàn)了interface所定義的函數(shù),自動就implement了這個(gè)interface,沒有像Java那樣冗長的class申明,提供了靈活太多的設(shè)計(jì)度和OO抽象度,讓你的代碼也非常干凈。千萬不要以為你習(xí)慣了Java那種一條一條加implements的方式,感覺還行,等接口的設(shè)計(jì)越來越復(fù)雜的時(shí)候,無數(shù)Bug正在后面等著你。

同時(shí),正因?yàn)槿绱?,Go語言的interface可以用來表示任何generic的東西,比如一個(gè)空的interface,可以是string可以是int,可以是任何數(shù)據(jù)類型,因?yàn)檫@些數(shù)據(jù)類型都不需要實(shí)現(xiàn)任何函數(shù),自然就滿足空interface的定義了。加上Go語言的type assertion,可以提供一般動態(tài)語言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯(cuò)誤。

5. OO

Go語言本質(zhì)上不是面向?qū)ο笳Z言,它還是過程化的。但是,在Go語言中, 你可以很輕易的做大部分你在別的OO語言中能做的事,用更簡單清晰的邏輯。是的,在這里,不需要class,仍然可以繼承,仍然可以多態(tài),但是速度卻快得多。因?yàn)楸举|(zhì)上,OO在Go語言中,就是普通的struct操作。

6. Goroutine

這個(gè)幾乎算是Go語言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,這玩意是超級輕量級的類似線程的東西,但通過它,你不需要復(fù)雜的線程操作鎖操作,不需要care調(diào)度,就能玩轉(zhuǎn)基本的并行程序。在Go語言里,觸發(fā)一個(gè)routine和erlang spawn一樣簡單?;旧弦莆誈o語言,以Goroutine和channel為核心的內(nèi)存模型是必須要懂的。不過請放心,真的非常簡單。

7. 更多現(xiàn)代的特性

和C比較,Go語言完全就是一門現(xiàn)代化語言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language類似), function是first class object,等等等等。

看到這里,你可能會發(fā)現(xiàn),我用了很多輕易,簡單,快速之類的形容詞來形容Go語言的特點(diǎn)。我想說的是,一點(diǎn)都不夸張,連Go語言的入門學(xué)習(xí)到提高,都比別的語言門檻低太多太多。在大部分人都有C的背景的時(shí)代,對于Go語言,從入門到能夠上手做項(xiàng)目,最多不過半個(gè)月。Go語言給人的感覺就是太直接了,什么都直接,讀源代碼直接,寫自己的代碼也直接。

如何在 Go 語言中使用 Redis 連接池

一、關(guān)于連接池

一個(gè)數(shù)據(jù)庫服務(wù)器只擁有有限的資源,并且如果你沒有充分使用這些資源,你可以通過使用更多的連接來提高吞吐量。一旦所有的資源都在使用,那么你就不 能通過增加更多的連接來提高吞吐量。事實(shí)上,吞吐量在連接負(fù)載較大時(shí)就開始下降了。通??梢酝ㄟ^限制與可用的資源相匹配的數(shù)據(jù)庫連接的數(shù)量來提高延遲和吞 吐量。

如何在Go語言中使用Redis連接池

如果不使用連接池,那么,每次傳輸數(shù)據(jù),我們都需要進(jìn)行創(chuàng)建連接,收發(fā)數(shù)據(jù),關(guān)閉連接。在并發(fā)量不高的場景,基本上不會有什么問題,一旦并發(fā)量上去了,那么,一般就會遇到下面幾個(gè)常見問題:

性能普遍上不去

CPU 大量資源被系統(tǒng)消耗

網(wǎng)絡(luò)一旦抖動,會有大量 TIME_WAIT 產(chǎn)生,不得不定期重啟服務(wù)或定期重啟機(jī)器

服務(wù)器工作不穩(wěn)定,QPS 忽高忽低

要想解決這些問題,我們就要用到連接池了。連接池的思路很簡單,在初始化時(shí),創(chuàng)建一定數(shù)量的連接,先把所有長連接存起來,然后,誰需要使用,從這里取走,干完活立馬放回來。 如果請求數(shù)超出連接池容量,那么就排隊(duì)等待、退化成短連接或者直接丟棄掉。

二、使用連接池遇到的坑

最近在一個(gè)項(xiàng)目中,需要實(shí)現(xiàn)一個(gè)簡單的 Web Server 提供 Redis 的 HTTP interface,提供 JSON 形式的返回結(jié)果??紤]用 Go 來實(shí)現(xiàn)。

首先,去看一下 Redis 官方推薦的 Go Redis driver。官方 Star 的項(xiàng)目有兩個(gè):Radix.v2 和 Redigo。經(jīng)過簡單的比較后,選擇了更加輕量級和實(shí)現(xiàn)更加優(yōu)雅的 Radix.v2。

Radix.v2 包是根據(jù)功能劃分成一個(gè)個(gè)的 sub package,每一個(gè) sub package 在一個(gè)獨(dú)立的子目錄中,結(jié)構(gòu)非常清晰。我的項(xiàng)目中會用到的 sub package 有 redis 和 pool。

由于我想讓這種被 fork 的進(jìn)程最好簡單點(diǎn),做的事情單一一些,所以,在沒有深入去看 Radix.v2 的 pool 的實(shí)現(xiàn)之前,我選擇了自己實(shí)現(xiàn)一個(gè) Redis pool。(這里,就不貼代碼了。后來發(fā)現(xiàn)自己實(shí)現(xiàn)的 Redis pool 與 Radix.v2 實(shí)現(xiàn)的 Redis pool 的原理是一樣的,都是基于 channel 實(shí)現(xiàn)的, 遇到的問題也是一樣的。)

不過在測試過程中,發(fā)現(xiàn)了一個(gè)詭異的問題。在請求過程中經(jīng)常會報(bào) EOF 錯(cuò)誤。而且是概率性出現(xiàn),一會有問題,一會又好了。通過反復(fù)的測試,發(fā)現(xiàn) bug 是有規(guī)律的,當(dāng)程序空閑一會后,再進(jìn)行連續(xù)請求,會發(fā)生3次失敗,然后之后的請求都能成功,而我的連接池大小設(shè)置的是3。再進(jìn)一步分析,程序空閑300秒 后,再請求就會失敗,發(fā)現(xiàn)我的 Redis server 配置了 timeout 300,至此,問題就清楚了。是連接超時(shí) Redis server 主動斷開了連接??蛻舳诉@邊從一個(gè)超時(shí)的連接請求就會得到 EOF 錯(cuò)誤。

然后我看了一下 Radix.v2 的 pool 包的源碼,發(fā)現(xiàn)這個(gè)庫本身并沒有檢測壞的連接,并替換為新server{location/pool{content_by_lua_block{localredis=require"resty.redis"localred=redis:new()localok,err=red:connect("127.0.0.1",6379)ifnotokthenngx.say("failedtoconnect:",err)returnendok,err=red:set("hello","world")ifnotokthenreturnendred:set_keepalive(10000,100)}}}

發(fā)現(xiàn)有個(gè) set_keepalive 的方法,查了一下官方文檔,方法的原型是 syntax: ok, err = red:set_keepalive(max_idle_timeout, pool_size) 貌似 max_idle_timeout 這個(gè)參數(shù),就是我們所缺少的東西,然后進(jìn)一步跟蹤源碼,看看里面是怎么保證連接有效的。

function_M.set_keepalive(self,...)localsock=self.sockifnotsockthenreturnnil,"notinitialized"endifself.subscribedthenreturnnil,"subscribedstate"endreturnsock:setkeepalive(...)end

至此,已經(jīng)清楚了,使用了 tcp 的 keepalive 心跳機(jī)制。

于是,通過與 Radix.v2 的作者一些討論,選擇自己在 redis 這層使用心跳機(jī)制,來解決這個(gè)問題。

四、最后的解決方案

在創(chuàng)建連接池之后,起一個(gè) goroutine,每隔一段 idleTime 發(fā)送一個(gè) PING 到 Redis server。其中,idleTime 略小于 Redis server 的 timeout 配置。連接池初始化部分代碼如下:

p,err:=pool.New("tcp",u.Host,concurrency)errHndlr(err)gofunc(){for{p.Cmd("PING")time.Sleep(idelTime*time.Second)}}()

使用 redis 傳輸數(shù)據(jù)部分代碼如下:

funcredisDo(p*pool.Pool,cmdstring,args...interface{})(reply*redis.Resp,errerror){reply=p.Cmd(cmd,args...)iferr=reply.Err;err!=nil{iferr!=io.EOF{Fatal.Println("redis",cmd,args,"erris",err)}}return}

其中,Radix.v2 連接池內(nèi)部進(jìn)行了連接池內(nèi)連接的獲取和放回,代碼如下:

//Cmdautomaticallygetsoneclientfromthepool,executesthegivencommand//(returningitsresult),andputstheclientbackinthepoolfunc(p*Pool)Cmd(cmdstring,args...interface{})*redis.Resp{c,err:=p.Get()iferr!=nil{returnredis.NewResp(err)}deferp.Put(c)returnc.Cmd(cmd,args...)}

這樣,我們就有了 keepalive 的機(jī)制,不會出現(xiàn) timeout 的連接了,從 redis 連接池里面取出的連接都是可用的連接了。看似簡單的代碼,卻完美的解決了連接池里面超時(shí)連接的問題。同時(shí),就算 Redis server 重啟等情況,也能保證連接自動重連。

分享文章:go語言qps go語言為什么突然火了
網(wǎng)頁URL:http://m.rwnh.cn/article22/hiiojc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、定制網(wǎng)站搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計(jì)

廣告

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

外貿(mào)網(wǎng)站建設(shè)
阿拉善盟| 五大连池市| 广水市| 新宁县| 资阳市| 甘孜| 新巴尔虎左旗| 土默特左旗| 咸宁市| 庆云县| 磴口县| 阳山县| 梁河县| 虎林市| 博兴县| 石楼县| 保亭| 汉川市| 阿巴嘎旗| 陈巴尔虎旗| 凤凰县| 阿勒泰市| 昭苏县| 古交市| 南平市| 咸丰县| 彰化市| 巴南区| 顺平县| 宕昌县| 南投市| 无极县| 明光市| 礼泉县| 长寿区| 建始县| 中卫市| 聂拉木县| 太白县| 堆龙德庆县| 乌海市|