ä¸ãå
³äºè¿æ¥æ±
ä¸ä¸ªæ°æ®åºæå¡å¨åªæ¥ææéçèµæºï¼å¹¶ä¸å¦æä½ æ²¡æå
å使ç¨è¿äºèµæºï¼ä½ å¯ä»¥éè¿ä½¿ç¨æ´å¤çè¿æ¥æ¥æé«ååéãä¸æ¦ææçèµæºé½å¨ä½¿ç¨ï¼é£ä¹ä½ å°±ä¸ è½éè¿å¢å æ´å¤çè¿æ¥æ¥æé«ååéãäºå®ä¸ï¼ååéå¨è¿æ¥è´è½½è¾å¤§æ¶å°±å¼å§ä¸éäºãé常å¯ä»¥éè¿éå¶ä¸å¯ç¨çèµæºç¸å¹é
çæ°æ®åºè¿æ¥çæ°éæ¥æé«å»¶è¿åå åéã
å¦ä½å¨Goè¯è¨ä¸ä½¿ç¨Redisè¿æ¥æ±
å¦æä¸ä½¿ç¨è¿æ¥æ± ï¼é£ä¹ï¼æ¯æ¬¡ä¼ è¾æ°æ®ï¼æ们é½éè¦è¿è¡å建è¿æ¥ï¼æ¶åæ°æ®ï¼å
³éè¿æ¥ãå¨å¹¶åéä¸é«çåºæ¯ï¼åºæ¬ä¸ä¸ä¼æä»ä¹é®é¢ï¼ä¸æ¦å¹¶åéä¸å»äºï¼é£ä¹ï¼ä¸è¬å°±ä¼éå°ä¸é¢å 个常è§é®é¢ï¼
æ§è½æ®éä¸ä¸å»
CPU 大éèµæºè¢«ç³»ç»æ¶è
ç½ç»ä¸æ¦æå¨ï¼ä¼æ大é TIME_WAIT 产çï¼ä¸å¾ä¸å®æéå¯æå¡æå®æéå¯æºå¨
æå¡å¨å·¥ä½ä¸ç¨³å®ï¼QPS 忽é«å¿½ä½
è¦æ³è§£å³è¿äºé®é¢ï¼æ们就è¦ç¨å°è¿æ¥æ± äºãè¿æ¥æ± çæè·¯å¾ç®åï¼å¨åå§åæ¶ï¼å建ä¸å®æ°éçè¿æ¥ï¼å
æææé¿è¿æ¥åèµ·æ¥ï¼ç¶åï¼è°éè¦ä½¿ç¨ï¼ä»è¿éåèµ°ï¼å¹²å®æ´»ç«é©¬æ¾åæ¥ã å¦æ请æ±æ°è¶
åºè¿æ¥æ± 容éï¼é£ä¹å°±æéçå¾
ãéåæçè¿æ¥æè
ç´æ¥ä¸¢å¼æã
äºã使ç¨è¿æ¥æ± éå°çå
æè¿å¨ä¸ä¸ªé¡¹ç®ä¸ï¼éè¦å®ç°ä¸ä¸ªç®åç Web Server æä¾ Redis ç HTTP interfaceï¼æä¾ JSON å½¢å¼çè¿åç»æãèèç¨ Go æ¥å®ç°ã
é¦å
ï¼å»çä¸ä¸ Redis å®æ¹æ¨èç Go Redis driverãå®æ¹ Star ç项ç®æ两个ï¼Radix.v2 å Redigoãç»è¿ç®åçæ¯è¾åï¼éæ©äºæ´å è½»é级åå®ç°æ´å ä¼é
ç Radix.v2ã
Radix.v2 å
æ¯æ ¹æ®åè½ååæä¸ä¸ªä¸ªç sub packageï¼æ¯ä¸ä¸ª sub package å¨ä¸ä¸ªç¬ç«çåç®å½ä¸ï¼ç»æé常æ¸
æ°ãæç项ç®ä¸ä¼ç¨å°ç sub package æ redis å poolã
ç±äºææ³è®©è¿ç§è¢« fork çè¿ç¨æ好ç®åç¹ï¼åçäºæ
åä¸ä¸äºï¼æ以ï¼å¨æ²¡ææ·±å
¥å»ç Radix.v2 ç pool çå®ç°ä¹åï¼æéæ©äºèªå·±å®ç°ä¸ä¸ª Redis poolã(è¿éï¼å°±ä¸è´´ä»£ç äºãåæ¥åç°èªå·±å®ç°ç Redis pool ä¸ Radix.v2 å®ç°ç Redis pool çåçæ¯ä¸æ ·çï¼é½æ¯åºäº channel å®ç°ç, éå°çé®é¢ä¹æ¯ä¸æ ·çã)
ä¸è¿å¨æµè¯è¿ç¨ä¸ï¼åç°äºä¸ä¸ªè¯¡å¼çé®é¢ãå¨è¯·æ±è¿ç¨ä¸ç»å¸¸ä¼æ¥ EOF é误ãèä¸æ¯æ¦çæ§åºç°ï¼ä¸ä¼æé®é¢ï¼ä¸ä¼å好äºãéè¿åå¤çæµè¯ï¼åç° bug æ¯æè§å¾çï¼å½ç¨åºç©ºé²ä¸ä¼åï¼åè¿è¡è¿ç»è¯·æ±ï¼ä¼åç3次失败ï¼ç¶åä¹åç请æ±é½è½æåï¼èæçè¿æ¥æ± 大å°è®¾ç½®çæ¯3ãåè¿ä¸æ¥åæï¼ç¨åºç©ºé²300ç§ åï¼å请æ±å°±ä¼å¤±è´¥ï¼åç°æç Redis server é
ç½®äº timeout 300ï¼è³æ¤ï¼é®é¢å°±æ¸
æ¥äºãæ¯è¿æ¥è¶
æ¶ Redis server 主å¨æå¼äºè¿æ¥ã客æ·ç«¯è¿è¾¹ä»ä¸ä¸ªè¶
æ¶çè¿æ¥è¯·æ±å°±ä¼å¾å° EOF é误ã
ç¶åæçäºä¸ä¸ Radix.v2 ç pool å
çæºç ï¼åç°è¿ä¸ªåºæ¬èº«å¹¶æ²¡ææ£æµåçè¿æ¥ï¼å¹¶æ¿æ¢ä¸ºæ°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)}}}
åç°æ个 set_keepalive çæ¹æ³ï¼æ¥äºä¸ä¸å®æ¹ææ¡£ï¼æ¹æ³çååæ¯ syntax: ok, err = red:set_keepalive(max_idle_timeout, pool_size) è²ä¼¼ max_idle_timeout è¿ä¸ªåæ°ï¼å°±æ¯æ们æ缺å°çä¸è¥¿ï¼ç¶åè¿ä¸æ¥è·è¸ªæºç ï¼ççéé¢æ¯æä¹ä¿è¯è¿æ¥ææçã
function_M.set_keepalive(self,...)localsock=self.sockifnotsockthenreturnnil,"notinitialized"endifself.subscribedthenreturnnil,"subscribedstate"endreturnsock:setkeepalive(...)end
è³æ¤ï¼å·²ç»æ¸
æ¥äºï¼ä½¿ç¨äº tcp ç keepalive å¿è·³æºå¶ã
äºæ¯ï¼éè¿ä¸ Radix.v2 çä½è
ä¸äºè®¨è®ºï¼éæ©èªå·±å¨ redis è¿å±ä½¿ç¨å¿è·³æºå¶ï¼æ¥è§£å³è¿ä¸ªé®é¢ã
åãæåç解å³æ¹æ¡
å¨å建è¿æ¥æ± ä¹åï¼èµ·ä¸ä¸ª goroutineï¼æ¯éä¸æ®µ idleTime åéä¸ä¸ª 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 ä¼ è¾æ°æ®é¨å代ç å¦ä¸ï¼
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 è¿æ¥æ± å
é¨è¿è¡äºè¿æ¥æ± å
è¿æ¥çè·ååæ¾åï¼ä»£ç å¦ä¸ï¼
//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 çæºå¶ï¼ä¸ä¼åºç° timeout çè¿æ¥äºï¼ä» redis è¿æ¥æ± éé¢ååºçè¿æ¥é½æ¯å¯ç¨çè¿æ¥äºãçä¼¼ç®åç代ç ï¼å´å®ç¾ç解å³äºè¿æ¥æ± éé¢è¶
æ¶è¿æ¥çé®é¢ãåæ¶ï¼å°±ç® Redis server éå¯çæ
åµï¼ä¹è½ä¿è¯è¿æ¥èªå¨éè¿ã
温馨提示:答案为网友推荐,仅供参考