這篇文章主要介紹redis如何解決高并發(fā)問(wèn)題,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、做網(wǎng)站、老邊網(wǎng)絡(luò)推廣、微信小程序、老邊網(wǎng)絡(luò)營(yíng)銷、老邊企業(yè)策劃、老邊品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供老邊建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
具體如下:
redis為什么會(huì)有高并發(fā)問(wèn)題
redis的出身決定
redis是一種單線程機(jī)制的NoSql數(shù)據(jù)庫(kù),基于key-value,數(shù)據(jù)可持久化落盤(pán)。由于單線程所以redis本身并沒(méi)有鎖的概念,多個(gè)客戶端連接并不存在競(jìng)爭(zhēng)關(guān)系,但是利用jedis等客戶端對(duì)redis進(jìn)行并發(fā)訪問(wèn)時(shí)會(huì)出現(xiàn)問(wèn)題。發(fā)生連接超時(shí)、數(shù)據(jù)轉(zhuǎn)換錯(cuò)誤、阻塞、客戶端關(guān)閉連接等問(wèn)題,這些問(wèn)題均是由于客戶端連接混亂造成。
同時(shí),單線程的天性決定,高并發(fā)對(duì)同一個(gè)鍵的操作會(huì)排隊(duì)處理,如果并發(fā)量很大,可能造成后來(lái)的請(qǐng)求超時(shí)。
在遠(yuǎn)程訪問(wèn)redis的時(shí)候,因?yàn)榫W(wǎng)絡(luò)等原因造成高并發(fā)訪問(wèn)延遲返回的問(wèn)題。
解決辦法
1.在客戶端將連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫(xiě)Redis操作采用內(nèi)部鎖synchronized。
2.服務(wù)器角度,利用setnx變向?qū)崿F(xiàn)鎖機(jī)制。這個(gè)方法在實(shí)際環(huán)境中如何使用,本人并不清楚。
jedis常見(jiàn)錯(cuò)誤分析
異常代碼1:
復(fù)制代碼 代碼如下:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
問(wèn)題分析:redis.clients.util.Pool.getResource
會(huì)從JedisPool池中返回一個(gè)可用的redis連接,關(guān)于JedisPool中可用連接的配置有幾個(gè)重要的參數(shù)如下:
1.MaxActive:可用連接實(shí)例的最大數(shù)目,為負(fù)數(shù)的時(shí)候沒(méi)有限制。
2.MaxIdle:空閑連接實(shí)例的最大數(shù)目,為負(fù)值時(shí)沒(méi)有限制。
3.MaxWait:等待獲取鏈接的超時(shí)時(shí)間。
也就是說(shuō)當(dāng)連接池中沒(méi)有active/idle的連接時(shí),會(huì)等待maxWait時(shí)間,如果等待超時(shí)還沒(méi)有可用連接,則拋出Could not get a resource from the pool異常。所以為避免這樣的錯(cuò)誤,
我們應(yīng)該根據(jù)程序?qū)嶋H情況合理設(shè)置這三個(gè)參數(shù)的值,同時(shí)在我們獲取一個(gè)連接的程序方法中也應(yīng)該合理的處理這個(gè)異常,當(dāng)沒(méi)有連接可用時(shí),等待一段時(shí)間再獲取也許是個(gè)比較好的選擇。
異常代碼2:
復(fù)制代碼 代碼如下:
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
遇到這個(gè)異常,可能會(huì)比較疑惑,redis是對(duì)內(nèi)存的操作,速度一個(gè)在毫秒級(jí)別,在對(duì)redis操作出現(xiàn)秒級(jí)別的操作時(shí)會(huì)讓人感覺(jué)疑惑,但是本文開(kāi)頭已經(jīng)說(shuō)過(guò)了,在一些特殊情況下,redis出現(xiàn)超時(shí)并不奇怪。jedis在初始化JedisPool時(shí)應(yīng)該根據(jù)實(shí)際情況通過(guò)redis.clients.jedis.JedisPoolConfig
合理設(shè)置連接池參數(shù),通過(guò)redisPool構(gòu)造方法,設(shè)置socket讀取輸入InputStream的超時(shí)時(shí)間。
`pool = new JedisPool(config, host, port, 100000)`;
第四個(gè)參數(shù)是time out,單位是毫秒??梢酝ㄟ^(guò)合理的設(shè)置這個(gè)值來(lái)規(guī)避問(wèn)題。但是這不能完全解決超時(shí)的為題。有些高并發(fā)情況下,延時(shí)返回時(shí)間甚至?xí)_(dá)到幾十秒的極端情況。這個(gè)問(wèn)題要通過(guò)代碼層面解決redis單線程本身不支持鎖,在對(duì)同一個(gè)鍵進(jìn)行并發(fā)操作會(huì)產(chǎn)生競(jìng)爭(zhēng)的問(wèn)題。
以上是“Redis如何解決高并發(fā)問(wèn)題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!