国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ngx_srcache + lua異步更新緩存----提升10倍的響應速度

baishancloud / 1475人閱讀

摘要:異步更新緩存一直使用作為反向代理服務器,一來基于事件驅動,速度快。同時,本身還能提供快速的讀寫速度。都是由于自動刪除過期緩存,導致的緩存缺失。在結束請求的同時,使用一個異步任務去更新緩存,考慮到并發情況,這里也需要使用一個共享內存鎖。

nginx_lua異步更新緩存 NGINX

一直使用nginx作為反向代理服務器,一來nginx基于事件驅動,速度快。而來nginx的反向代理模塊能很好的支持頁面緩存負載均衡

頁面緩存

nginx有proxy_cache這個內置的緩存功能,是基于文件的。如果把緩存路徑設置到RAMDISK上面,可以達到和內存緩存差不多的緩存讀寫速度。這樣做雖然解決了文件讀寫慢的問題,但是如果分布式部署的時候,這個緩存不能跨機器共享。

srcache-nginx-module

章大神寫的這個模塊支持和另一個模塊配合將頁面緩存寫入redis集群。就很好的解決了

緩存不能跨機器共享的問題

也使得緩存大小不受單機資源限制

同時,redis本身還能提供快速的讀寫速度

問題

看上面列的幾點,似乎已經很完美了。
但是在實際使用的時候還是發現有需要改善的地方:

緩存不存在的時候:
第一個請求查詢redis失敗,到后端,最后還要存儲redis。比沒有緩存的情況還多出兩次redis訪問,一次讀一次寫。而且當并發訪問的時候還可能請求都會進入后端服務器,后端不夠健壯的時候會導致“雪崩效應”。(如果使用默認的proxy_cache模塊還能通過proxy_cache_use_stale命令避免,但是srcache模塊沒有實現類似功能)

緩存失效的時候
通常我們為頁面設置緩存時間,緩存失效的時候,需要重新更新緩存。這個時候也會出現第一種情況類似的問題。

以上兩種情況,第一種出現較少,第二種情況出現較多。都是由于redis自動刪除過期緩存,導致的緩存缺失。

解決辦法

由于nginx不知道redis里面數據的緩存時間,所以會頻繁的導致緩存缺失的情況出現。
既然知道原因了,那么咱們就來針對性的解決一下這個問題。讓nginx能夠知道甚至參與到緩存時間的管理里面,就能有效的避免被動的緩存缺失問題,能有意識的主動更新緩存

ngx_lua

這里需要提到一個nginx的第三方模塊就是把lua集成到nginx里面擴展了nginx配置文件語法,支持在配置文件里面直接使用lua語言編寫邏輯。

lua-resty-cache

我將自己在項目中使用的一個倉庫開源到github上面了。

能讓nginx主動的檢測緩存的過期時間

在快過期的時候,直接返回舊的緩存數據

使用異步任務更新緩存

以上的第二第三兩點,就能在緩存快過期的時候,主動的異步更新緩存,讓終端用戶感知不到更新緩存的過程。
項目中實測,使用這個緩存機制之后,用戶感知到的平均響應速度提升了10倍(nginx access log分析結果),而這都是在原有系統性能不變的情況下實現的!是不是有點不可思議。

原理

下面就來說一說提升速度的原理:

如果緩存缺失,直接跳過srcache_fetch步驟,將請求發到后端server。同時申請一個共享內存鎖,并發而來的相同的請求不用發送到后端,而是等待這個請求返回。

更新緩存的時候,在過期時間expire基礎上加上一個stale time。那么在到了過期時間的時候,redis還不會立即刪掉這個數據。

如果檢測到數據過期,但是redis還能拿到這個“過期”數據,則立即返回過期數據給終端用戶。

在結束請求的同時,使用一個異步任務去更新緩存,考慮到并發情況,這里也需要使用一個共享內存鎖。

這樣,即使在緩存過期的時候,用戶也很少會遇到只能從后端server拿數據的情況。所以能節省相當的時間,在速度上有這么大的提升。

后記

這個庫運行了有好幾個月了,非常的穩定。當然這得益于nginx的穩定。
但是也不得不說,使用這個庫之后,后端server能夠收到的請求,已經絕大部分都是由那個異步的任務發出的。用戶基本都能在緩存里面直接拿到數據。所以,后端server的性能,沒有提升,但是給用戶的感覺卻是快了很多!!!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39197.html

相關文章

  • ngx_srcache + lua異步更新緩存----提升10倍的響應速度

    摘要:異步更新緩存一直使用作為反向代理服務器,一來基于事件驅動,速度快。同時,本身還能提供快速的讀寫速度。都是由于自動刪除過期緩存,導致的緩存缺失。在結束請求的同時,使用一個異步任務去更新緩存,考慮到并發情況,這里也需要使用一個共享內存鎖。 nginx_lua異步更新緩存 NGINX 一直使用nginx作為反向代理服務器,一來nginx基于事件驅動,速度快。而來nginx的反向代理模塊能很好...

    gaomysion 評論0 收藏0
  • UPYUN Open Talk :同盾,從零打造千萬級實時風控云服務

    摘要:同盾技術總監張新波在第二期移動時代互聯網金融的架構趨勢中闡述了同盾是如何從零開始打造千萬級實時風控云服務,具體介紹了同盾系統平臺構建過程中主要需要解決的三大難題,以及解決這些問題的具體時實踐過程。 同盾科技,是由阿里、Paypal 反欺詐專家創建的,國內第一家風險控制與反欺詐云服務提供商,其涉及領域包括電商、B2B、互聯網金融、游戲等。同盾技術總監張新波在 UPYUN Open ...

    malakashi 評論0 收藏0
  • 寫文件操作探微

    摘要:寫緩存與寫磁盤先看下寫文件操作的流程結構圖磁盤緩存是物理內存的一部分,專門供操作系統用作讀寫磁盤的緩沖之用。這印證了前面的說法,字符串在文件關閉前只在磁盤緩存里,還未真正寫到磁盤上,所以讀進程無法讀出。 多進程讀寫同一個文件的問題 不考慮文件內容的錯亂,多進程是可以同時讀寫一個文件的。當一個進程在寫,讀的進程能否讀到最新的內容,取決于最新的內容是否真正寫到了磁盤上。 寫緩存與寫磁盤 先...

    plus2047 評論0 收藏0
  • 寫文件操作探微

    摘要:寫緩存與寫磁盤先看下寫文件操作的流程結構圖磁盤緩存是物理內存的一部分,專門供操作系統用作讀寫磁盤的緩沖之用。這印證了前面的說法,字符串在文件關閉前只在磁盤緩存里,還未真正寫到磁盤上,所以讀進程無法讀出。 多進程讀寫同一個文件的問題 不考慮文件內容的錯亂,多進程是可以同時讀寫一個文件的。當一個進程在寫,讀的進程能否讀到最新的內容,取決于最新的內容是否真正寫到了磁盤上。 寫緩存與寫磁盤 先...

    cppowboy 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<