我在nginx中嵌入了一些Lua代码。在这段代码中,我从Redis缓存中获取了一些小数据。现在我想知道,如果使用ngx.shared
构造在nginx中缓存这些数据(在某种意义上已经缓存)是一个好习惯吗?这样做是否有任何利弊?在伪代码中,我希望有类似的东西:
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 :(得分:2)
如文档中所述ngx.shared
是nginx服务器的所有工作者共享的空间。
所有列出的操作都是原子操作,因此如果您依次对ngx.shared
使用两个操作,则只需要担心race conditions。在这种情况下,应使用ngx.semaphore
保护它们。
专业人士:
ngx.shared
可以更快地访问数据,因为您可以避免对Redis服务器的请求/响应循环。ngx.semaphore
,您也可以更快地访问数据(但我没有提供基准)。缺点:
ngx.shared
缓存提供的数据不准确,因为本地缓存不会反映当前的Redis值。这并不总是一个关键点,因为工作人员使用的值与Redis中存储的值之间总是存在差异。ngx.shared
中存储的数据可能不一致,这一点更为重要。例如,它可以存储x=true
和y=false
,而在Redis x
和y
中始终具有相同的值。这取决于您更新本地缓存的方式。redis.get
之后处理更新时都会遇到错误,因为您(或某人)会忘记更新。ngx.cache
中找不到值,您就必须自动从Redis中读取它。如果你在每次拨打cache.get
之后把它们放进来处理读取,就会出现错误,因为你(或某人)会忘记它。对于最后两点,您可以轻松编写一个小包装模块。
作为结论:
ngx.shared
很有意思,因为您始终可以拥有始终保持最新的Redis数据缓存。ngx.shared
进行缓存。 ngx.shared
。另外,不要忘记将缓存的值存储在local
变量中,以避免一次又一次get
,从而提高效率。