• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Java调用Lua

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

概述

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

常见问题

  1. 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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap