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