Openresty最佳案例 | 第7篇: 模組開發、OpenResty連線Redis
Lua模組開發
在實際的開發過程中,不可能把所有的lua程式碼寫在一個lua檔案中,通常的做法將特定功能的放在一個lua檔案中,即用lua模組開發。在lualib目錄下,預設有以下的lua模組。
lualib/ ├── cjson.so ├── ngx │ ├── balancer.lua │ ├── ocsp.lua │ ├── re.lua │ ├── semaphore.lua │ ├── ssl │ │ └── session.lua │ └── ssl.lua ├── rds │ └── parser.so ├── redis │ └── parser.so └── resty ├── aes.lua ├── core │ ├── base64.lua │ ├── base.lua │ ├── ctx.lua │ ├── exit.lua │ ├── hash.lua │ ├── misc.lua │ ├── regex.lua │ ├── request.lua │ ├── response.lua │ ├── shdict.lua │ ├── time.lua │ ├── uri.lua │ ├── var.lua │ └── worker.lua ├── core.lua ├── dns │ └── resolver.lua ├── limit │ ├── conn.lua │ ├── req.lua │ └── traffic.lua ├── lock.lua ├── lrucache │ └── pureffi.lua ├── lrucache.lua ├── md5.lua ├── memcached.lua ├── mysql.lua ├── random.lua ├── redis.lua ├── sha1.lua ├── sha224.lua ├── sha256.lua ├── sha384.lua ├── sha512.lua ├── sha.lua ├── string.lua ├── upload.lua ├── upstream │ └── healthcheck.lua └── websocket ├── client.lua ├── protocol.lua └── server.lua
在使用這些模組之前,需要在nginx的配置檔案nginx.conf中的http模組加上以下的配置:
lua_package_path "/usr/example/lualib/?.lua;;"; #lua 模組
lua_package_cpath "/usr/example/lualib/?.so;;"; #c模組
現在來簡單的開發一個lua模組:
vim /usr/example/lualib/module1.lua
在module1.lua檔案加上以下的程式碼:
local count = 0 local function hello() count = count + 1 ngx.say("count : ", count) end local _M = { hello = hello } return _M
開發時將所有資料做成區域性變數/區域性函式;通過 _M匯出要暴露的函式,實現模組化封裝。
在/usr/example/lua目錄下建立一個test_module_1.lua 檔案,在該檔案中引用上面的module1.lua檔案。
vim /usr/example/lua/test_module_1.lua
加上以下程式碼:
local module1 = require("module1")
module1.hello()
通過require(“模組名”)來載入模組,如果是多級目錄,則需要通過require(“目錄1.目錄2.模組名”)載入。
在/user/example/example.conf中加上以下的配置:
location /lua_module_1 {
default_type 'text/html';
lua_code_cache on;
content_by_lua_file /usr/example/lua/test_module_1.lua;
}
count : 1
count : 2
count : 3
...
安裝redis
linux下安裝:
cd /usr/servers
$ wget http://download.redis.io/releases/redis-3.2.6.tar.gz
$ tar xzf redis-3.2.6.tar.gz
$ cd redis-3.2.6
$ make
啟動redis:
nohup /usr/servers/redis-3.2.6/src/redis-server /usr/servers/redis-3.2.6/redis.conf &
檢視是否啟動:
ps -ef |grep redis
終端顯示:
root 20985 14268 0 18:49 pts/0 00:00:00 /usr/servers/redis-3.2.6/src/redis-server 127.0.0.1:6379
可見redis已經啟動。
lua連線redis
lua-resty-redis - Lua redis client driver for the ngx_lua based on the cosocket API
lua_resty_redis 它是一個基於cosocket API的為ngx_lua模組提供Lua redis客戶端的驅動。
建立一個test_redis_basic.lua檔案
vim /usr/example/lua/test_redis_basic.lua
local function close_redis(red)
if not red then
return
end
local pool_max_idle_time = 10000 --毫秒
local pool_size = 100 --連線池大小
local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
if not ok then
ngx.say("set keepalive error : ", err)
end
end
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(1000)
local ip = "127.0.0.1"
local port = 6379
local ok, err = red:connect(ip, port)
if not ok then
ngx.say("connect to redis error : ", err)
return close_redis(red)
end
ok, err = red:set("msg", "hello world")
if not ok then
ngx.say("set msg error : ", err)
return close_redis(red)
end
local resp, err = red:get("msg")
if not resp then
ngx.say("get msg error : ", err)
return close_redis(red)
end
if resp == ngx.null then
resp = ''
end
ngx.say("msg : ", resp)
close_redis(red)
上面的程式碼很簡單,通過連線池連線Redis,連線上redis後,通過set一對鍵值對(msg,helloword)到redis中,然後get(msg),並通過ngx.say()返回給瀏覽器。
vim /usr/example/example.conf,新增以下的配置程式碼:
location /lua_redis_basic {
default_type 'text/html';
lua_code_cache on;
content_by_lua_file /usr/example/lua/test_redis_basic.lua;
}
瀏覽器顯示:
msg : hello world
lua_resty_redis支援所有的redis指令,本身Redis就支援lua語言操作。所以lua_resty_redis模組能夠提高所有的redis操作的功能。
在很多時候,Redis是設定了口令的,連線時,如果需要驗證口令,需要新增 local res, err = red:auth(“foobared”),示例程式碼如下:
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000) -- 1 sec
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
local res, err = red:auth("foobared")
if not res then
ngx.say("failed to authenticate: ", err)
return
end
更多請關注的官方文件https://github.com/openresty/lua-resty-redis
和開濤的部落格http://jinnianshilongnian.iteye.com/blog/2187328
掃碼關注公眾號有驚喜
(轉載本站文章請註明作者和出處 方誌朋的部落格)