1. 程式人生 > 其它 >Nginx Lua拓展模組操作Redis

Nginx Lua拓展模組操作Redis

# Nginx的拓展模組

# ngx_lua模組
# 淘寶開發的ngx_lua模組通過lua直譯器整合近Nginx,可以採用lua指令碼實現業務邏輯,由於lua的緊湊、快速以及內建協程,所以在保證寶兵法服務能力的同時極大地降低了業務邏輯實現成本
# ngx_lua模組環境準備
# 方式一:OpenRestry
# OpenRestry是由淘寶工程師開發的,其官網是(http://openresty.org/),其上提供了大量的Lua庫、第三方模組以及大多數的依賴項。
# 用於方便地搭建能夠處理超高併發、擴充套件性極高的動態Web應用、Web服務和動態網站。
# 所以OpenResty內部就已經集成了Nginx和Lua,所以我們使用起來會更加方便。
# 安裝 # 1.下載:https://openresty.org/download/openresty-1.19.9.1.tar.gz # 2.解壓縮:tar -zxf openresty-1.19.9.1.tar.gz # 3.進入解壓縮後的目錄:cd openresty-1.19.9.1 # 4.執行配置命令:./configure # 5.執行編譯和安裝: make && make install # 6.進入openresty目錄,找到Nginx:cd /usr/local/openresty/nginx/ # 7.在conf目錄下的Nginx.conf新增如下內容 location /lua { default_type
'text/html'; content_by_lua 'ngx.say("<h1>Hello world,openresty</h1>")'; } # 8.在sbin目錄下啟動nginx # 9.通過瀏覽器訪問測試 # 直接進入使用例子: location /getByGender { default_type 'text/html'; # set_by_lua set_by_lua $param " --獲取請求URL上的引數對應值 name gender local uri_args = ngx.req.get_uri_args() local name
= uri_args['name'] local gender = uri_args['gender'] -- 條件判斷 if gender=='1' then return name..'先生' elseif gender=='0' then return name..'女士' else return name end " charset utf-8; return 200 $param } # lua操作redis # Redis在系統中經常作為資料快取、記憶體資料庫使用,在大型系統中扮演者非常重要的作用。在Nginx核心系統中,Redis是常備主鍵。 # Nginx支援3種方法訪問Redis,分別是:HttpRedis模組、HttpRedis2Module、lua-resty-redis庫。 # 這三種方式中HttpRedis模組提供的指令少,功能單一,合適做簡單的快取,HttpRedis2Module模組比HttpRedis模組操作更靈活,功能更強大。 #lua-resty-redis庫是OpenResty提供的一個Redis的介面庫,可根據自己的業務情況來做一些邏輯處理,社和做複雜的業務邏輯。 # 步驟一:lua-resty-redis環境準備:準備一臺redis的伺服器 # 步驟二:準備對應的API # lua-resty-redis提供了訪問Redis的詳細API,包括建立對接、連結、操作、資料處理等。這些api基本上與Redis的操作一一對應 # 1.lua匯入lua-resty-redis redis = require "resty.redis" # 2.new 語法。建立一個Redis物件 redis,err = redis:new() # 3.connect 設定連結Redis的連結資訊 ok,err=redis:connect(host,port[,options_table]) # ok:連線成功返回1,連線失敗返回nil # err:返回報錯資訊 # 4.set_timeout,設定請求操作Redis的超時時間 redis:set_timeout(time) # 5.close 關閉當前連結。成功返回1,失敗返回nil和錯誤資訊 ok,err = redis:close() # 6.redis命令對應的方法 # 在lua-resty-redis中,所有的Redis命令獨有自己的方法,方法名字和命令明智相同,只是全是小寫。 # 例項: location /testRedis{ default_type "text/html"; content_by_lua_block{ local redis = require "resty.redis" local redisObj = redis:new() redisObj:set_timeout(1000) local ok,err = redisObj:connect("192.168.200.111", 6379) if not ok then ngx.say("failed to connection redis", err) return end ok,err = redisObj:set("username", "ROSE") if not ok then ngx.say("faild to set username", err) return end local username, err = redisObj.get("username") if not username then ngx.say("faild to get username",err) return else ngx.say(username) redisObj:close() } }