openrestry 緩存

OpenResty 的緩存

咱們介紹下在 OpenResty 裏面,有哪些緩存的方法。nginx

使用 lua shared dict

咱們看下面這段代碼: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 算法(最近常常使用)來判斷緩存是否在內存佔滿時被清除。算法

使用 lua LRU cache

直接複製下春哥的示例代碼:緩存

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

相關文章
相關標籤/搜索