概述
Lua是一个比较小巧的编程语言,其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能(比如嵌入到Springboot中去调用脚本),这里我就不介绍Lua相关环境的安装啦~
数据类型与常用语法
注释
--单行注释
或者
--[[
多行注释
--]]
数据类型
Lua有8个基本类型:
- nil:表示一个无效值(在条件表达式中相当于false)
- boolean
- number:表示双精度类型的实浮点数
- string:字符串由一对双引号或单引号来表示
- userdata:表示任意存储在变量中的C数据结构
- function
- thread:表示执行的独立线路,用于执行协同程序
- table:一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。
变量
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用local
显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
变量的默认值均为 nil。
for循环
for var=exp1,exp2,exp3 do
--TO DO SOMETHING
end
eg.Springboot内嵌的Lua脚本,调用Redis get命令循环执行50次
local key = KEYS[1]
for i = 100,1,-1 do
redis.call('get',key)
end
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。
if 和 else
--[ 0 为 true ]
if(0)
then
print("0 为 true")
end
Lua中false和nil为假,true和非nil为真。
函数
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
eg. 发送http Get请求
local zhttp = require "resty.http"
local function http_post_client(url, timeout)
local httpc = zhttp.new()
timeout = timeout or 30000
httpc:set_timeout(timeout)
local res, err_ = httpc:request_uri(url, {
method = "GET",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
}
})
httpc:set_keepalive(5000, 100)
--httpc:close()
return res, err_
end
运算符
+、-、*、/、%、^
字符串
可用单引号、双引号以及[[ xxx ]]
表示。
如何在Springboot中使用RedisTemplate调用Lua脚本
@Service
public class UserServiceImpl implements UserService{
@Autowired
private RedisTemplate<String,Object> redisTemplate1;
private DefaultRedisScript<List> redisScript;
@PostConstruct
public void init(){
redisScript = new DefaultRedisScript<List>();
redisScript.setResultType(List.class);
//.lua文件放到Springboot项目的resource目录下
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("LuaScript.lua")));
}
//将User名字存入Redis中
@Override
public void redisSetUser(String key, String name){
/**
* List设置lua的KEYS
*/
List<String> keyList = new ArrayList();
keyList.add(key);
List<String> argvList = new ArrayList();
argvList.add(argvList);
/**
* 调用脚本并执行
* 此处脚本里面编写redis.call('set',KEYS[1],ARGV[1])来存入用户名
*/
redisTemplate1.execute(getRedisScript,keyList, argvList);
}
}