概述
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
SciTE开发lua
推荐使用SciTE 进行一些简单的语法练习,新建lua文件,保存到本地,F5直接运行
下载地址: https://github.com/rjpcomputing/luaforwindows/releases
包含了windows运行lua的lua.exe
print("hello !!!")
a = 10 -- 全局变量
local b = 20 --局部变量
c = "str"
print(type(a)) -- type(a) 输出类型 number
print(type(2.222)) -- Lua 默认只有一种 number 类型
print(type(c)) -- string类型
print(a+1) -- 变量a无需定义类型
print("1" + 2) --进行算术操作时,String会转换数字
-- print(a+"ss") -- 报错,进行算术操作时,String会转换数字
-- if语句
if(a==10)
then
print("a = 10")
else
print("a != 10")
end
sciTE 中文乱码
解决方案: File - encoding - UTF-8
idea开发lua
安装插件
File - settings - Plugins - MarketPlace 中搜索 安装 EmmyLua,重启idea
配置SDK
File - Project Structure - SDKs ,选择lua.exe 同级目录即可
lua官网 : http://www.lua.org/
windows lua 下载地址: https://github.com/rjpcomputing/luaforwindows/releases
附 linux安装,5.3为例
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
新建lua工程
简单代码测试环境 print(123) 控制台正常输出 OK
常见问题
- lua.exe: cannot open lua/LuaTest.lua: No such file or directory
–路径问题,Entry Flie 改为绝对路径
为什么会这样?最后发现是 目录 的问题,在sources root – java 下新建lua文件可以直接运行,其实正确的开发姿势应该是新建lua工程,而不是在java工程下
windows上运行lua脚本
* 运行方式1
* 在redis目录,通过cmd执行
* redis-cli --eval equals.lua key1 key2 , 123
* 123.lua 为脚本名称,空格 跟keys ,逗号之后 空格 跟 argv
比较输入的两个数字是否相等
local k1 = ARGV[1];
local k2 = KEYS[1];
if(ARGV[1] == KEYS[1]) then
return 1
end
限制ip访问次数
本文示例Redis版本3.2,Redis 2.6.12新增set多参数命令,详见 Redis SET命令
redis-cli --eval limit.lua 192.168.11.3 , 3 10000
192.168.11.3 是 KEYS[1] 代表ip,空格之后跟逗号,3 10000 代表 10秒内只允许该ip访问3次
-- 限制同一IP访问次数 每分钟访问10次
local key = "rate.limit:" .. KEYS[1] -- 要限制的唯一name,比如ip
local limit = tonumber(ARGV[1]) -- 次数
local expire_time = ARGV[2] -- 多久时间
local is_exists = redis.call("EXISTS", key) -- 单位毫秒
if is_exists == 1 then
if redis.call("INCR", key) > limit then
return "NO" -- 拒绝访问
else
return "OK2" -- 区别第一次set成功的结果
end
else
return redis.call("SET", key, "1","NX","PX",expire_time) -- 第一次返回OK
end
java代码调用lua脚本
@Test
public void test1(){
try (Jedis jedis = new Jedis("localhost")) {
final String script = "local key1 = KEYS[1]\n" +
"local key2 = KEYS[2]\n" +
"local argv1 = ARGV[1]\n" +
"return \"key1:\"..key1 ..\" key2:\"..key2.. \" argv1:\"..argv1";
Object result = jedis.eval(script, Arrays.asList("key1","haha2"),Arrays.asList("argg"));
System.out.println(result);
} catch (Exception e) {
throw new RedisException("error");
}
}
script可以通过外部文件加载
InputStream input = new FileInputStream("D:\\unLock.lua");
byte[] by = new byte[input.available()];
input.read(by);
String script = new String(by);
持续学习,持续更新……
参考资料 : https://www.cnblogs.com/number7/p/8320259.html
|
请发表评论