五、lua的语法( 六 )


通过上述的案例学习,()得到的结果res都是table类型,要想在页面上展示,就必须知道table的具体数据结构才能进行遍历获取 。处理起来比较麻烦,接下来我们介绍一种简单方式cjson,使用它就可以将table类型的数据转换成json字符串,把json字符串展示在页面上即可 。具体如何使用?
步骤一:引入cjson
local cjson = require "cjson"
步骤二:调用cjson的方法进行类型转换
步骤二:调用cjson的encode方法进行类型转换
步骤三:使用
location /testMysql{default_type 'text/html';# 这里面是lua代码 content_by_lua_block{local mysql = require "resty.mysql"local cjson = require "cjson"local db = mysql:new()local ok,error = db:connect{host = "192.168.38.131",port = 3306,user ="root",password="123456",database="nginx"}db:set_timeout(1000)db:send_query("select * from users where id=1")local res,err,errcode,sqlstate = db:read_result()-- ngx.say(res[1].id..","..res[1].username..","..res[1].birthday..","..res[1].salary)ngx.say(cjson.encode(res))for i,v in ipairs(res) dongx.say(v.id..","..v.username..","..v.birthday..","..v.salary)end db:close()}}
lua-resty-mysql实现数据库的增删改
优化和
本方法是和组合的快捷方法 。
语法:
res, err, errcode, sqlstate = db:query(sql[,rows])
有了该API,上面的代码我们就可以进行对应的优化,如下:
增、删、改
location /testMysql{default_type 'text/html';# 这里面是lua代码 content_by_lua_block{-- 引入mysqllocal mysql = require "resty.mysql"-- 引入cjsonlocal cjson = require "cjson"-- 创建MySQL对象local db = mysql:new()-- 创建连接local ok,error = db:connect{host = "192.168.38.131",port = 3306,user ="root",password="123456",database="nginx"}-- 设置连接超时时间db:set_timeout(1000)-- 使用query优化send_query、read_result-- local sql = "select * from users"-- local sql = "insert into users (id,username,birthday,salary) values(6,'lss','1998-07-28',20000)"local sql = "update users set username='lzz' where id =6"local sql="delete from users where id =6"local res,err,errcode,sqlstate = db:query(sql)ngx.say(cjson.encode(res))}}
增加
删除
修改
综合小案例
使用模块完成Redis缓存预热 。
缓存预热 1. 定义
缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统 。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据 。
2.解决方案 直接写个缓存页面刷新,上线时手工操作下 。数据量不大,可以在项目启动的时候自动进行加载 。定时刷新缓存 。
分析:
(1)先得有一张表(users)
(2)浏览器输入如下地址
http://191.168.38.131?username=TOM
(3)从表中查询出符合条件的记录,此时获取的结果为table类型
(4)使用cjson将table数据转换成json字符串
(5)将查询的结果数据存入Redis中
http {includemime.types;default_typeapplication/octet-stream;sendfileon;keepalive_timeout65;#该指令在每次nginx重新加载配置时执行 #可以用来完成一些耗时模块的加载或者#初始化一些全局init_by_lua_block{redis = require "resty.redis"mysql = require "resty.mysql"cjson = require "cjson"}server {listen80;server_namelocalhost;#charset koi8-r;#access_loglogs/host.access.logmain;location /{default_type "text/html";content_by_lua_block{-- 获取请求的参数username-- ngx.req.get_uri_args()-- 获取所有请求参数 返回数据-- 类型为tablelocal param = ngx.req.get_uri_args()["username"]-- 建立mysql数据库的连接local db = mysql:new()local ok,err = db:connect{host = "192.168.38.131",port = 3306,user = "root",password = "123456",database = 'nginx'}if not ok thenngx.say("failed connect to mysql,",err)return -- 结束程序,不再往下走end-- 设置连接超时时间db:set_timeout(1000)-- 查询数据local sql = ""if not param thensql = "select * from users"elsesql = "select * from users where username= ".."'"..param.."'"endlocal res,err,errcode,sqlstate =db:query(sql)if not res thenngx.say("failed to query from mysql,",err)returnend-- 连接redislocal rd = redis:new()ok,err = rd:connect("192.168.38.131", 6379)if not ok thenngx.say("failed to connect to redis,",err)returnend-- redis加了密码要加这行ok,err = rd:auth("123456")if not ok thenngx.say("failed to authenticate",err);returnendrd:set_timeout(1000)-- 循环遍历数据for i,v in ipairs(res) dord:set("user_"..v.username,cjson.encode(v))endngx.say("success")rd:close()db:close()}}