咱們介紹下在 OpenResty 裏面,有哪些緩存的方法。nginx
咱們看下面這段代碼:git
function get_from_cache(key) local cache_ngx = ngx.shared.my_cache local value = cache_ngx:get(key) return value end function set_to_cache(key, value, exptime) if not exptime then exptime = 0 end local cache_ngx = ngx.shared.my_cache local succ, err, forcible = cache_ngx:set(key, value, exptime) return succ end
這裏面用的就是 ngx shared dict cache 。你可能會奇怪, ngx.shared.my_cache 是從哪裏冒出來的?沒錯,少貼了 nginx.conf 裏面的修改:github
lua_shared_dict my_cache 128 m;
如同它的名字同樣,這個 cache 是 nginx 全部 worker 之間共享的,內部使用的 LRU 算法(最近常常使用)來判斷緩存是否在內存佔滿時被清除。算法
直接複製下春哥的示例代碼:緩存
local _M = {} -- alternatively: local lrucache = require "resty.lrucache.pureffi" local lrucache = require "resty.lrucache" -- we need to initialize the cache on the lua module level so that -- it can be shared by all the requests served by each nginx worker process: local c = lrucache.new(200) -- allow up to 200 items in the cache if not c then return error("failed to create the cache: " .. (err or "unknown")) end function _M.go() c:set("dog", 32) c:set("cat", 56) ngx.say("dog: ", c:get("dog")) ngx.say("cat: ", c:get("cat")) c:set("dog", { age = 10 }, 0.1) -- expire in 0.1 sec c:delete("dog") end return _M
能夠看出來,這個 cache 是 worker 級別的,不會在 nginx wokers 之間共享。而且,它是預先分配好 key 的數量,而 shared dcit 須要本身用 key 和 value 的大小和數量,來估算須要把內存設置爲多少。memcached
在性能上,兩個並無什麼差別,都是在 Nginx 的進程中獲取到緩存,這都比從本機的 memcached 或者 Redis 裏面獲取,要快不少。性能
你須要考慮的,一個是 lua lru cache 提供的 API 比較少,如今只有 get 、 set 和 delete ,而 ngx shared dict 還能夠 add 、 replace 、 incr 、 get_stale (在 key 過時時也能夠返回以前的值)、 get_keys (獲取全部 key ,雖然不推薦,但說不定你的業務須要呢);第二個是內存的佔用,因爲 ngx shared dict 是 workers 之間共享的,因此在多 worker 的狀況下,內存佔用比較少。ui