摘要:異步更新緩存一直使用作為反向代理服務(wù)器,一來(lái)基于事件驅(qū)動(dòng),速度快。同時(shí),本身還能提供快速的讀寫速度。都是由于自動(dòng)刪除過期緩存,導(dǎo)致的緩存缺失。在結(jié)束請(qǐng)求的同時(shí),使用一個(gè)異步任務(wù)去更新緩存,考慮到并發(fā)情況,這里也需要使用一個(gè)共享內(nèi)存鎖。
nginx_lua異步更新緩存 NGINX
一直使用nginx作為反向代理服務(wù)器,一來(lái)nginx基于事件驅(qū)動(dòng),速度快。而來(lái)nginx的反向代理模塊能很好的支持頁(yè)面緩存和負(fù)載均衡。
頁(yè)面緩存nginx有proxy_cache這個(gè)內(nèi)置的緩存功能,是基于文件的。如果把緩存路徑設(shè)置到RAMDISK上面,可以達(dá)到和內(nèi)存緩存差不多的緩存讀寫速度。這樣做雖然解決了文件讀寫慢的問題,但是如果分布式部署的時(shí)候,這個(gè)緩存不能跨機(jī)器共享。
srcache-nginx-module章大神寫的這個(gè)模塊支持和另一個(gè)模塊配合將頁(yè)面緩存寫入redis集群。就很好的解決了
緩存不能跨機(jī)器共享的問題
也使得緩存大小不受單機(jī)資源限制。
同時(shí),redis本身還能提供快速的讀寫速度。
問題看上面列的幾點(diǎn),似乎已經(jīng)很完美了。
但是在實(shí)際使用的時(shí)候還是發(fā)現(xiàn)有需要改善的地方:
緩存不存在的時(shí)候:
第一個(gè)請(qǐng)求查詢r(jià)edis失敗,到后端,最后還要存儲(chǔ)redis。比沒有緩存的情況還多出兩次redis訪問,一次讀一次寫。而且當(dāng)并發(fā)訪問的時(shí)候還可能請(qǐng)求都會(huì)進(jìn)入后端服務(wù)器,后端不夠健壯的時(shí)候會(huì)導(dǎo)致“雪崩效應(yīng)”。(如果使用默認(rèn)的proxy_cache模塊還能通過proxy_cache_use_stale命令避免,但是srcache模塊沒有實(shí)現(xiàn)類似功能)
緩存失效的時(shí)候
通常我們?yōu)轫?yè)面設(shè)置緩存時(shí)間,緩存失效的時(shí)候,需要重新更新緩存。這個(gè)時(shí)候也會(huì)出現(xiàn)第一種情況類似的問題。
以上兩種情況,第一種出現(xiàn)較少,第二種情況出現(xiàn)較多。都是由于redis自動(dòng)刪除過期緩存,導(dǎo)致的緩存缺失。
解決辦法由于nginx不知道redis里面數(shù)據(jù)的緩存時(shí)間,所以會(huì)頻繁的導(dǎo)致緩存缺失的情況出現(xiàn)。
既然知道原因了,那么咱們就來(lái)針對(duì)性的解決一下這個(gè)問題。讓nginx能夠知道甚至參與到緩存時(shí)間的管理里面,就能有效的避免被動(dòng)的緩存缺失問題,能有意識(shí)的主動(dòng)更新緩存。
這里需要提到一個(gè)nginx的第三方模塊就是把lua集成到nginx里面擴(kuò)展了nginx配置文件語(yǔ)法,支持在配置文件里面直接使用lua語(yǔ)言編寫邏輯。
lua-resty-cache我將自己在項(xiàng)目中使用的一個(gè)倉(cāng)庫(kù)開源到github上面了。
能讓nginx主動(dòng)的檢測(cè)緩存的過期時(shí)間
在快過期的時(shí)候,直接返回舊的緩存數(shù)據(jù)
使用異步任務(wù)更新緩存
以上的第二第三兩點(diǎn),就能在緩存快過期的時(shí)候,主動(dòng)的異步更新緩存,讓終端用戶感知不到更新緩存的過程。
項(xiàng)目中實(shí)測(cè),使用這個(gè)緩存機(jī)制之后,用戶感知到的平均響應(yīng)速度提升了10倍(nginx access log分析結(jié)果),而這都是在原有系統(tǒng)性能不變的情況下實(shí)現(xiàn)的!是不是有點(diǎn)不可思議。
下面就來(lái)說一說提升速度的原理:
如果緩存缺失,直接跳過srcache_fetch步驟,將請(qǐng)求發(fā)到后端server。同時(shí)申請(qǐng)一個(gè)共享內(nèi)存鎖,并發(fā)而來(lái)的相同的請(qǐng)求不用發(fā)送到后端,而是等待這個(gè)請(qǐng)求返回。
更新緩存的時(shí)候,在過期時(shí)間expire基礎(chǔ)上加上一個(gè)stale time。那么在到了過期時(shí)間的時(shí)候,redis還不會(huì)立即刪掉這個(gè)數(shù)據(jù)。
如果檢測(cè)到數(shù)據(jù)過期,但是redis還能拿到這個(gè)“過期”數(shù)據(jù),則立即返回過期數(shù)據(jù)給終端用戶。
在結(jié)束請(qǐng)求的同時(shí),使用一個(gè)異步任務(wù)去更新緩存,考慮到并發(fā)情況,這里也需要使用一個(gè)共享內(nèi)存鎖。
這樣,即使在緩存過期的時(shí)候,用戶也很少會(huì)遇到只能從后端server拿數(shù)據(jù)的情況。所以能節(jié)省相當(dāng)?shù)臅r(shí)間,在速度上有這么大的提升。
后記這個(gè)庫(kù)運(yùn)行了有好幾個(gè)月了,非常的穩(wěn)定。當(dāng)然這得益于nginx的穩(wěn)定。
但是也不得不說,使用這個(gè)庫(kù)之后,后端server能夠收到的請(qǐng)求,已經(jīng)絕大部分都是由那個(gè)異步的任務(wù)發(fā)出的。用戶基本都能在緩存里面直接拿到數(shù)據(jù)。所以,后端server的性能,沒有提升,但是給用戶的感覺卻是快了很多?。?!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/61766.html
摘要:異步更新緩存一直使用作為反向代理服務(wù)器,一來(lái)基于事件驅(qū)動(dòng),速度快。同時(shí),本身還能提供快速的讀寫速度。都是由于自動(dòng)刪除過期緩存,導(dǎo)致的緩存缺失。在結(jié)束請(qǐng)求的同時(shí),使用一個(gè)異步任務(wù)去更新緩存,考慮到并發(fā)情況,這里也需要使用一個(gè)共享內(nèi)存鎖。 nginx_lua異步更新緩存 NGINX 一直使用nginx作為反向代理服務(wù)器,一來(lái)nginx基于事件驅(qū)動(dòng),速度快。而來(lái)nginx的反向代理模塊能很好...
摘要:同盾技術(shù)總監(jiān)張新波在第二期移動(dòng)時(shí)代互聯(lián)網(wǎng)金融的架構(gòu)趨勢(shì)中闡述了同盾是如何從零開始打造千萬(wàn)級(jí)實(shí)時(shí)風(fēng)控云服務(wù),具體介紹了同盾系統(tǒng)平臺(tái)構(gòu)建過程中主要需要解決的三大難題,以及解決這些問題的具體時(shí)實(shí)踐過程。 同盾科技,是由阿里、Paypal 反欺詐專家創(chuàng)建的,國(guó)內(nèi)第一家風(fēng)險(xiǎn)控制與反欺詐云服務(wù)提供商,其涉及領(lǐng)域包括電商、B2B、互聯(lián)網(wǎng)金融、游戲等。同盾技術(shù)總監(jiān)張新波在 UPYUN Open ...
摘要:寫緩存與寫磁盤先看下寫文件操作的流程結(jié)構(gòu)圖磁盤緩存是物理內(nèi)存的一部分,專門供操作系統(tǒng)用作讀寫磁盤的緩沖之用。這印證了前面的說法,字符串在文件關(guān)閉前只在磁盤緩存里,還未真正寫到磁盤上,所以讀進(jìn)程無(wú)法讀出。 多進(jìn)程讀寫同一個(gè)文件的問題 不考慮文件內(nèi)容的錯(cuò)亂,多進(jìn)程是可以同時(shí)讀寫一個(gè)文件的。當(dāng)一個(gè)進(jìn)程在寫,讀的進(jìn)程能否讀到最新的內(nèi)容,取決于最新的內(nèi)容是否真正寫到了磁盤上。 寫緩存與寫磁盤 先...
摘要:寫緩存與寫磁盤先看下寫文件操作的流程結(jié)構(gòu)圖磁盤緩存是物理內(nèi)存的一部分,專門供操作系統(tǒng)用作讀寫磁盤的緩沖之用。這印證了前面的說法,字符串在文件關(guān)閉前只在磁盤緩存里,還未真正寫到磁盤上,所以讀進(jìn)程無(wú)法讀出。 多進(jìn)程讀寫同一個(gè)文件的問題 不考慮文件內(nèi)容的錯(cuò)亂,多進(jìn)程是可以同時(shí)讀寫一個(gè)文件的。當(dāng)一個(gè)進(jìn)程在寫,讀的進(jìn)程能否讀到最新的內(nèi)容,取決于最新的內(nèi)容是否真正寫到了磁盤上。 寫緩存與寫磁盤 先...
閱讀 756·2021-09-30 09:47
閱讀 2948·2021-09-04 16:40
閱讀 924·2019-08-30 13:18
閱讀 3504·2019-08-29 16:22
閱讀 1629·2019-08-29 12:36
閱讀 672·2019-08-29 11:11
閱讀 1530·2019-08-26 13:47
閱讀 1191·2019-08-26 13:32