lua nginx mysql_在nginx中使用lua直接訪问mysql和memcaced达到数据接口的统一

本文介绍如何使用Nginx Lua模块访问MySQL数据库,并利用Memcache进行数据缓存。当请求到达时,首先尝试从Memcache中获取数据,若未命中则查询MySQL并将结果缓存到Memcache中。

对于訪问接口的统一有非常多的处理方式,这里介绍使用nginx lua 訪问mysql并用memcache缓存起来。

配置例如以下:

...

location /getinfo {

default_type 'text/plain';

content_by_lua '

local args = ngx.req.get_uri_args()

if args["appleid"] == nil then

ngx.say("param appleid is nil")

return

end

local memcached = require "memcached"

local memc, err = memcached:new()

if not memc then

ngx.say("failed to instantiate memc: ", err)

return

end

memc:set_timeout(1000) -- 1 sec

local ok, err = memc:connect("172.16.18.114", 11211)

if not ok then

ngx.say("failed to connect: ", err)

return

end

local res, flags, err = memc:get(args["appleid"])

if err then

ngx.say("failed to get memc: ", err)

return

end

if not res then

local mysql = require "mysql"

local db, err = mysql:new()

if not db then

ngx.say("failed to instantiate mysql: ", err)

return

end

db:set_timeout(1000) -- 1 sec

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

host = "172.16.18.162",

port = 3306,

database = "test",

user = "root",

password = "cpyf",

max_packet_size = 1024 * 1024

}

if not ok then

ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)

return

end

-- ngx.say("connected to mysql.")

sql = "select * from tagval where tag = \'" .. args["appleid"] .. "\'"

res, err, errno, sqlstate = db:query(sql)

if not res then

ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")

return

end

local json = require "json"

ngx.say("mysql found")

ngx.say(json.encode(res))

local ok, err = memc:set(args["appleid"], json.encode(res))

if not ok then

ngx.say("failed to set memc: ", err)

return

end

local ok, err = db:set_keepalive(0, 100)

if not ok then

ngx.say("failed to set keepalive: ", err)

return

end

return

end

ngx.say("memc found")

ngx.say(res)

memc:set_keepalive(0, 100)

';

}

...

第二次执行:

mysql found

[{"val":"123","tag":"jfy"}]

第二次后执行:

memc found

[{"val":"123","tag":"jfy"}]

结果已被缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值