新聞中心
??隨著越來越多的應(yīng)用轉(zhuǎn)向使用Redis做跨進(jìn)程、跨服務(wù)之間的通信,部分應(yīng)用在對Redis數(shù)據(jù)庫進(jìn)行寫服務(wù)時(shí),將RedHat作為多線程,當(dāng)多線程同時(shí)寫入Redis之中,就會面臨超時(shí)風(fēng)險(xiǎn)。

創(chuàng)新互聯(lián)建站主要從事網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)江州,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
??當(dāng)多線程同時(shí)且異步地寫入Redis時(shí),因?yàn)槊總€(gè)線程寫庫的耗時(shí)不一,會導(dǎo)致寫入隊(duì)列一直被占用,從而使線程之間的通信失敗,出現(xiàn)各種超時(shí)現(xiàn)象。以下是異步多線程寫入Redis面臨超時(shí)風(fēng)險(xiǎn)的示例代碼:
import redis, threading
from time import sleep
#establish connection to redis
r = redis.Redis(host='localhost', port=6379, db=0)
def thread_function(name):
r.set(name,0, 10)
sleep(2)
print(r.get(name))
Thread1 = threading.Thread(target=thread_function, args=('key1',))
Thread2 = threading.Thread(target=thread_function, args=('key2',))
# Starting thread 1 and 2
Thread1.start()
Thread2.start()
# wt until thread 1 and 2 are completely executed
Thread1.join()
Thread2.join()
??以上代碼中,線程1和線程2同時(shí)訪問Redis,但是根據(jù)線程2睡眠時(shí)間,線程1先結(jié)束,會導(dǎo)致后續(xù)操作線程2寫入Redis時(shí)可能因?qū)憥礻?duì)列一直被線程1占用,從而超時(shí)。
??面對異步多線程寫入Redis面臨超時(shí)風(fēng)險(xiǎn),我們可以考慮使用帶超時(shí)的Redis命令,及時(shí)釋放寫入鎖資源;適當(dāng)增加可以復(fù)用的連接池,以減少連接建立的時(shí)間;增加寫入超時(shí)控制因子等等。另外,為此,可以使用熔斷模式,如果Redis寫入服務(wù)在規(guī)定時(shí)間內(nèi)沒有完成,就放棄寫入,切換到替代寫入方式中去。
??異步多線程寫入Redis面臨超時(shí)風(fēng)險(xiǎn),可以從Redis命令、復(fù)用連接池、寫入超時(shí)控制因子、使用熔斷模式等多個(gè)方面去盡量減小超時(shí)的可能性,從而提高寫入Redis的效率和性能。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
當(dāng)前標(biāo)題:異步多線程寫入Redis面臨超時(shí)風(fēng)險(xiǎn)(多線程寫入redis超時(shí))
文章起源:http://m.fisionsoft.com.cn/article/dhidssp.html


咨詢
建站咨詢
