常用开发库
原创大约 4 分钟
操作Redis
Lua的重要作用之一就是能够操作常用的外部数据源,形成基于Nginx的数据缓存层,所以Redis就成了它的主要操作对象。
使用已有的环境:Docker部署Redis。
基本的Redis数据读写代码如下。
修改/usr/local/openresty/nginx/conf/lua.conf
文件。
> vi /usr/local/openresty/nginx/conf/lua.conf
server {
listen 9527;
server_name _;
location /redis {
default_type 'text/html';
lua_code_cache on;
content_by_lua_file $result conf/lua/redis.lua;
}
}
然后在/usr/local/openresty/nginx/conf/lua
中新建redis.lua
文件,并输入如下内容。
-- 创建实例
local redis = require("resty.redis")
local conn = redis:new()
-- 设置超时(毫秒)
conn:set_timeout(1000)
-- 建立连接
local ok, err = conn:connect("127.0.0.1", 6379)
if not ok then
return
end
-- 通过密码访问
local res, err = conn:auth("123456")
if not res then
ngx.say("connect to redis error: ", err)
return
end
-- 先设置一个kv
res, err = conn:set("mykey", "hello lua")
if not res then
ngx.say("set key error: ", err)
local ok, err = conn:close()
if not ok then
ngx.say("close redis error: ", err)
end
end
-- 读取数据
local value, err = conn:get("mykey")
if not value then
ngx.say("get key error: ", err)
local ok, err = conn:close()
if not ok then
ngx.say("close redis error: ", err)
end
end
-- 判空处理
if value == ngx.null then
value = ''
end
ngx.say("mykey ==> ", value)
在浏览器中访问http://服务器IP:9527/redis,如果不报错的话就会在页面上输出mykey ==> hello lua
。
每次连接之后都要执行一次conn:close()
比较麻烦,而且需要批量设置数据的话,可以这样修改redis.lua
文件。
-- 将释放连接操作提取出来
local function close_conn(conn)
if not conn then
return
end
-- 连接池实现释放连接
-- 连接最大空闲时间(毫秒)
local pool_max_idle_time = 10000
-- 连接池大小
local pool_size = 100
local ok, err = conn: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 conn = redis:new()
-- 设置超时(毫秒)
conn:set_timeout(1000)
-- 建立连接
local ok, err = conn:connect("127.0.0.1", 6379)
if not ok then
return
end
-- 通过密码访问
local res, err = red:auth("123456")
if not res then
ngx.say("connect to redis error: ", err)
return
end
-- 先设置一个kv
res, err = conn:set("mykey", "hello lua")
if not res then
ngx.say("set key error: ", err)
return close_conn(conn)
end
-- 读取数据
local value, err = conn:get("mykey")
if not value then
ngx.say("get key error: ", err)
return close_conn(conn)
end
-- 判空处理
if value == ngx.null then
value = ''
end
ngx.say("mykey ==> ", value)
-- 初始化管道
conn:init_pipeline()
conn:set("mykey1", "hello")
conn:set("mykey2", "lua")
conn:get("mykey1")
conn:get("mykey2")
-- 提交操作
local data, err = conn:commit_pipeline()
-- 判空处理
if data == ngx.null then
data = {}
end
-- 遍历table
for k, v in ipairs(data) do
ngx.say("k ==> ", v, "<br>")
end
重启Nginx后再次在浏览器中访问http://服务器IP:9527/redis,如果不报错的话就会在页面上输出如下内容。
mykey1 ==> hello
mykey2 ==> lua
操作MySQL
使用已有的环境:Docker部署MySQL。
修改/usr/local/openresty/nginx/conf/lua.conf
文件。
> vi /usr/local/openresty/nginx/conf/lua.conf
server {
listen 9527;
server_name _;
location /mysql {
default_type 'text/html';
lua_code_cache on;
content_by_lua_file $result conf/lua/mysql.lua;
}
}
然后在/usr/local/openresty/nginx/conf/lua
中新建mysql.lua
文件,并输入如下内容。
-- 将关闭数据库的操作单独提取出来
local function close_conn(conn, res, err, errno, state)
if not conn then
return
end
if not res then
ngx.say("operate mysql error: ", err, ", errno: ", errno, ", state: ", state)
return conn:close()
end
end
-- 引入mysql模块
local mysql = require("resty.mysql")
-- 创建实例
local conn, err = mysql:new()
if not conn then
ngx.say("new mysql error:", err)
return
end
-- 超时时间
conn:set_timeout(5000)
-- 建立连接
local props = {
host = "172.16.185.176",
port = 3306,
database = "sys",
user = "root",
password = "123456"
}
local res, err, errno, state = conn:connect(props)
close_conn(conn, res, err, errno, state)
-- 删除表
local drop_table_sql = "drop table if exists test"
res, err, errno, state = conn:query(drop_table_sql)
close_conn(conn, res, err, errno, state)
-- 创建表
local create_table_sql = "create table test(id int(11) primary key auto_increment, name varchar(64))"
res, err, errno, state = conn:query(create_table_sql)
close_conn(conn, res, err, errno, state)
-- 插入
local insert_sql = "insert into test (name) values('lixingyun')"
res, err, errno, state = conn:query(insert_sql)
close_conn(conn, res, err, errno, state)
ngx.say("insert rows ==> ", res.affected_rows, ", id ==> ", res.insert_id, "<br>")
-- 更新
local update_sql = "update test set name = 'lixingyun' where id = " .. res.insert_id
res, err, errno, state = conn:query(update_sql)
close_conn(conn, res, err, errno, state)
ngx.say("update rows ==> ", res.affected_rows, "<br>")
-- 查询并遍历结果
local select_sql = "select id, name from test"
res, err, errno, state = conn:query(select_sql)
close_conn(conn, res, err, errno, state)
for i, row in ipairs(res) do
for name, value in pairs(row) do
ngx.say("select rows ==> ", i, " : ", name, " ==> ", value, "<br>")
end
end
-- 删除
local delete_sql = "delete from test"
res, err, errno, state = conn:query(delete_sql)
close_conn(conn, res, err, errno, state)
ngx.say("delete rows ==> ", res.affected_rows)
-- 关闭连接
conn:close()
重启Nginx后在浏览器中访问http://服务器IP:9527/mysql,如果不报错的话就会在页面上输出如下内容。
insert rows ==> 1, id ==> 1
update rows ==> 1
select rows ==> 1, name ==> lixingyun
delete rows ==> 1
Lua如果想操作MongoDB,需要安装LuaRocks包管理器。
# 因为luarocks-3.11.1需要lua-5.4及以上版本的支持,所以先安装lua-5.4.7
> cd /home/work
> wget https://www.lua.org/ftp/lua-5.4.7.tar.gz
> tar zxvf lua-5.4.7.tar.gz
> cd lua-5.4.7
> make linux test
> make install
> cd /home/work
> wget https://luarocks.github.io/luarocks/releases/luarocks-3.11.1.tar.gz
> tar zxpf luarocks-3.11.1.tar.gz
> cd luarocks-3.11.1
# 运行安装脚本
> ./configure
> make build
> make install
> make bootstrap
# 安装LuaMongo库
> luarocks install lua-mongo-bson
> luarocks install lua-mongo
感谢支持
更多内容,请移步《超级个体》。