lua mysql http_lua模块demo(redis,http,mysql,cjson,本地缓存)

1. lua模块demo(redis,http,mysql,cjson,本地缓存)

1.1. 配置

在nginx.conf中设置lua_shared_dict my_cache 128m; 开启nginx本地缓存,放到http{} 层

location配置

location /redis-get{

resolver 8.8.8.8;

default_type text/html;

content_by_lua_file /usr/local/openresty/lua/redis-get.lua;

}

这里推荐个工具,使用notepad++,下载个插件NppFtp,效果如下图,可以直接对liunx上的文件进行编辑保存

18ac6aeae1b3d4c96ee6371dec4d7f7c.png

1.2. http

把lib包里的两个文件复制到 /usr/local/openresty/lualib/resty

通过require("resty.http") 调用

1.3. mysql

连接工具

local connectMysqlUtil = {}

local mysql = require "resty.mysql"

-- connect to mysql;

function connectMysqlUtil.connect()

local db, err = mysql:new()

if not db then

return false

end

db:set_timeout(1000)

local ok, err, errno, sqlstate = db:connect{

host = "127.0.0.1",

port = 8083,

database = "test",

user = "dev",

password = "1234",

max_packet_size = 1024 * 1024 }

if not ok then

ngx.say("connect mysql failed")

return false

end

return db

end

return connectMysqlUtil

1.4. string工具

local stringEx = {}

function stringEx.ToStringEx(value)

if type(value)=='table' then

return stringEx.TableToStr(value)

elseif type(value)=='string' then

return "\'"..value.."\'"

else

return tostring(value)

end

end

function stringEx.TableToStr(t)

if t == nil then return "" end

local retstr= "{"

local i = 1

for key,value in pairs(t) do

local signal = ","

if i==1 then

signal = ""

end

if key == i then

retstr = retstr..signal..stringEx.ToStringEx(value)

else

if type(key)=='number' or type(key) == 'string' then

retstr = retstr..signal..'['..stringEx.ToStringEx(key).."]="..stringEx.ToStringEx(value)

else

if type(key)=='userdata' then

retstr = retstr..signal.."*s"..stringEx.TableToStr(getmetatable(key)).."*e".."="..stringEx.ToStringEx(value)

else

retstr = retstr..signal..key.."="..stringEx.ToStringEx(value)

end

end

end

i = i+1

end

retstr = retstr.."}"

return retstr

end

function stringEx.StrToTable(str)

if str == nil or type(str) ~= "string" then

return

end

return loadstring("return " .. str)()

end

return stringEx

1.5. 整合redis+本地缓存

-- 自定义的字符串转换工具

local stringEx = require("stringExt")

-- 本地缓存

local local_cache = ngx.shared.my_cache

-- redis连接池,设置连接空闲时间

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 fail ",err)

end

end

-- 读redis缓存

local function read_redis(key)

local redis = require("resty.redis")

local red = redis.new();

local ok,err = red:connect("127.0.0.1",8084)

if not ok then

ngx.say("connect fail ",err)

return close_redis(red)

end

red:set_timeout(1000)

local count,err = red:get_reused_times()

if 0==count then

ok,err = red:auth("123456")

if not ok then

ngx.say("auth fail ",err)

return close_redis(red)

end

elseif err then

ngx.say("fail to get reused times")

return close_redis(red)

end

local res,err = red:get(key)

if not res then

ngx.say("get msg fail ",err)

return close_redis(red)

elseif res then

ngx.say(" set expire 10000 ")

red:expire(key,10)

end

local_cache:set(key,res,5)

ngx.say("read from redis ")

ngx.say(res)

close_redis(red)

end

-- http请求参数

local args = ngx.req.get_uri_args()

local key = args["key"]

if not key then

ngx.say("key must be exist")

return

end

local keyCache = local_cache:get(key)

if not keyCache then

local res = read_redis(key)

if not res then

ngx.say("redis is null")

end

else

ngx.say("read from localCache ")

ngx.say(keyCache)

end

-- http调用工具,需要额外下载,地址:https://github.com/ledgetech/lua-resty-http 说明:https://blog.csdn.net/xiejunna/article/details/53445342

local http = require("resty.http")

local httpc = http.new();

if not httpc then

ngx.say("\n\r httpc new fail")

end

httpc:set_timeout(8000)

-- keepalive参数不写可能导致报错

local res,err = httpc:request_uri("http://www.xxx.com",{

method="POST",

path="/xxx/rpc.api",

body = 'a=1&b=2',

headers = {

["Content-Type"] = "application/x-www-form-urlencoded",

},

keepalive_timeout = 60,

keepalive_pool = 10

})

if not res then

ngx.say("httpc call fail ")

return

end

local cjson = require("cjson")

local json = cjson.new()

if not json then

ngx.say("json is null")

return

end

-- 测试调用结果

-- ngx.say(stringEx.TableToStr(res))

-- ngx.say(stringEx.ToStringEx(json.decode(res["body"])))

-- ngx.say(type(json.decode(res["body"])))

-- ngx.say(stringEx.ToStringEx(json.decode(res["body"])["header"]["request_seq"]))

-- ngx.say(type(json.decode(res["body"])["header"]))

-- ngx.say(type(json.decode(res["body"])["header"]["request_seq"]))

local connectMysqlUtil = require("connectMysqlUtil")

local db = connectMysqlUtil.connect()

if not db then

ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)

return

end

local res,err,errcode,sqlstate = db:query("select * from t_uls_order_info where order_id='20190119232946000023'",10)

if not res then

ngx.say("bad request: ",err,":",errcode,": ",sqlstate,".")

return

end

ngx.say("result:",json.encode(res))

1.6. 总结

本文记录了对http,mysql,redis,nginx本地缓存的基本使用方式,后续需要使用到该模块的需求可以直接参考修改本示例代码

对于实际的互联网需求,这里可以想象个基于这些模块的需求,优先读取ngnix本地缓存,过期时间较短,其次读取redis缓存,减少redis压力,进一步减少mysql读取压力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值