2017-08-09 33 views
0

我在nginx中嵌入了一些Lua代碼。在這段代碼中,我從Redis緩存中獲取了一些小數據。現在我想知道,如果在nginx中使用ngx.shared構造緩存這些數據(已經緩存在某種意義上)是一種好的做法?這樣做有什麼優點和缺點嗎?在僞代碼中,我希望有這樣的:在ngx中緩存Redis數據是一個好習慣.shared

local cache = ngx.shared.cache 
local cached_key = cache:get("cached_key") 
if cached_key == nil then 
    ... get data from Redis 
    cache:set("cached_key", cached_key) 
end 
+0

我認爲這個問題很模糊。谷歌搜索「ngx.shared.cache」返回字面上少於10個結果。你最好在適當的ML上問這個問題。 – cnst

+0

我認爲,搜索'ngx.shared.cache'沒有意義,因爲在這種情況下,緩存是我自己的變量名稱。這個問題相當概念化 - 在現實世界中,他們是否緩存nginx緩存中的Redis(或memcached)數據以提供更高的性能。 – Jacobian

回答

2

如文檔ngx.shared中所述的是Nginx的服務器的所有員工共享的空間。

所有列出的操作都是原子操作,因此如果您在ngx.shared上依次使用兩個操作,則只需要打擾race conditions。在這種情況下,應該使用ngx.semaphore來保護它們。

的優點:

  • 使用ngx.shared提供了數據訪問速度,因爲你避免請求/響應循環,Redis的服務器。
  • 即使您需要ngx.semaphore,您也可以更快地訪問數據(但我沒有提供基準)。

的缺點:

  • ngx.shared緩存提供不準確的數據,爲您的本地緩存中不反映當前Redis的值。這並不總是一個關鍵點,因爲工作人員使用的值與Redis中存儲的值之間始終存在差異。
  • 存儲在ngx.shared中的數據可能不一致,這更爲重要。例如,它可以存儲x=truey=false,而在Redis中,xy始終具有相同的值。這取決於你如何更新你的本地緩存。
  • 您必須通過更新緩存中的值(無論何時將其發送到Redis)來處理緩存。這可以通過包裝redis函數來輕鬆完成。如果您通過在每次致電redis.get後處理更新,因爲您(或某人)忘記它,預計會出現錯誤。
  • 您還必須處理讀取:只要您的ngx.cache中找不到值,就必須從Redis自動讀取它。如果你在每次打電話給cache.get後處理讀取操作,你會發現錯誤,因爲你(或某人)忘記了它。

對於最後兩點,您可以輕鬆地編寫一個小包裝模塊。

這樣的結論:

  • 如果你的服務器只運行一個實例,與一個或幾個工人,用ngx.shared有趣的是,因爲你總是可以有你的Redis數據的緩存是始終保持-日期。
  • 如果您的服務器運行多個實例並且必須始終保持最新緩存,或者如果可能存在一致性問題,則應該使用ngx.shared避免緩存。
  • 在所有情況下,如果數據量很大,請務必在內存消耗量過高之前提供一種清理方法。如果您無法提供清潔服務,則不應使用ngx.shared

另外,不要忘了存儲緩存值local變量中,以避免get連連荷蘭國際集團它,從而提高工作效率。

+0

謝謝,先生!這是非常豐富和有益的! – Jacobian

相關問題