6.nginx的共享字典、redis實戰簡介

首先創建一個lua文件

ngx.log(ngx.ERR,"lua sucess");

在nginx配置文件中加:

啓動nginx:

也就是說這個腳本會在nginx啓動的時候執行。當然,一般用的不多,用的更多的是content_by_lua來指定lua實現什麼樣的內容,接下來試一下:

配置下nginx

新建lua腳本:

ngx.say("hello static item lua");

重啓後訪問配置的地址:

文件打開後是:

因爲沒有指定http的default type,所以默認是文件的形式,接下來指定一下:

 重啓後:


對於OpenResty,我們之前已經介紹過了,他是由Nginx核心加很多第三方模塊組成的,默認集成了Lua開發環境,使得nginx可以作爲一個web server使用,藉助於nginx的事件驅動模型和非阻塞io,可以實現高性能的web應用程序。並且提供了大量的組件如Mysql、Redis、Memcached等,使nginx上開發web應用更方便更簡單。

實戰開始:

同樣新建lua腳本:

ngx.exec("/item/get?id=6");

nginx配置:

重啓nginx

 所以ngx.exec相當於轉發。

接下來認識一下nginx shared dic,這是共享內存字典,所有worker進程可見,可以指定lru淘汰規則。

配置一下shared dic:

寫lua腳本: 

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

local args = ngx.req.get_uri_args()
local id = args["id"]
local item_model = get_from_cache("item_"..id)
if item_model == nil then
        local resp = ngx.location.capture("/item/get?id="..id)
        item_model = resp.body
        set_to_cache("item_"..id,item_model,1*60)
end
ngx.say(item_model)

配置nginx 

結果: 

 

這樣就減輕了應用服務器的壓力,但是相對的壓力也全都在nginx服務器上了。當然它的更新機制跟之前說的內存緩存一樣,並不是很好,因此時間還是變成了一個很重要的一環,或者用redis:

nginx對於redis只讀不寫,當讀不出來的時候就發給應用程序,由應用程序來寫,這樣對於髒讀的面就小了很多。甚至可以在擴展redis主從機後,只從slave上讀。

寫腳本:

local args = ngx.req.get_uri_args()
local id = args["id"]
local redis = require "resty.redis"
local cache = redis:new()
local ok,err = cache:connect("172.18.57.95",6379)
local item_model = cache:get("item_"..id)
if item_model == ngx.null or item_model == nil then
        local resp = ngx.location.capture("/item/get?id="..id)
        item_model = resp.body
end
ngx.say(item_model)

改配置: 

運行結果都是一樣的,這裏不貼了。 

當然在壓測過程中,redis的壓力會比較大,所以在生產環境中,我們可以用redis的cluster來分散壓力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章