精华内容
下载资源
问答
  • Lua脚本编辑,简单编辑开发, 64位,window运行Lua脚本编辑,对于nginx做自定义扩展功能使用
  • NotePad++ 运行Lua脚本 NotePad++ 运行Lua脚本 登陆Lua官网下载资源 运行Lua解释 配置Notepad++编辑 登陆Lua官网下载资源 单击“get a binary” 运行Lua解释 解压压缩包 随便拷贝一个lua脚本...

    NotePad++ 运行Lua脚本

    登陆Lua官网下载资源


    单击“get a binary”


    运行Lua解释器

    解压压缩包

    随便拷贝一个lua脚本文件至该目录下,并在当前目录打开Bash控制台

    执行该脚本

    脚本正常运行

    配置Notepad++编辑器

    打开Notepad++,按下F5按键
    输入参数 F:\WorkPlace\软件\lua-5.3.5_Win64_bin\lua53.exe $(FULL_CURRENT_PATH) & PAUSE & EXIT

    其中$(FULL_CURRENT_PATH)表示Notepad++当前显示的文本


    接下来就可以使用快捷键来运行Lua脚本了

    直接使用Ctrl+C退出控制台

    展开全文
  • 在调用脚本时自动检测lua脚本中的KEYS [x]以正确配置#key字段 可以加载目录中的所有.lua文件或它们的子集 使用assert(condition, 'ERR_xxx_yyy..')引发的脚本将始终被表示为错误ERR_xxx_yyy...的OperationalError...
  • stm32f103移植lua解释,能够在片上运行lua语言脚本。 欢迎大家下载、学习、交流。
  • Redis lua脚本

    2016-10-14 14:18:52
    Redis lua脚本EVAL命令介绍自2.6.0版本以来, redis就自建有lua脚本解释,EVAL和EVALSHA就是用于执行lua脚本的命令. EVAL的第一个参数就是lua 5.1脚本. 这个脚本不需要(也不应该)定义一个lua方法来执行. 它只需是一...

    EVAL命令介绍

    自2.6.0版本以来, redis就自建有lua脚本解释器,EVALEVALSHA就是用于执行lua脚本的命令.
    EVAL的第一个参数就是lua 5.1脚本. 这个脚本不需要(也不应该)定义一个lua方法来执行. 它只需是一段lua程序, 就能够运行在redis服务的上下文.
    EVAL的第二个参数是代表redis键名称的脚本参数的数量. 这些参数可以通过全局数组变量KEYS在lua中访问(例如KEYS[1], KEYS[2],…顺便说下, lua数组是从1开始的).
    EVAL的其他额外参数可以通过全局数组ARGV在lua中访问(例如ARGV[1], ARGV[2],…).

    下面就是关于EVAL的例子

    > eval  "return { KEYS[1], KEYS[2], ARGV[1], ARGV[2] }"  2  key1  key2  first  second
    1) "key1"
    2) "key2"
    3) "first"
    4) "second"
    

    在lua脚本中, 我们可以调用下面两个方法去执行redis命令

    • redis.call()
    • redis.pcall()

    redis.call()redis.pcall()相似, 唯一的不同是如果redis调用报错, redis.call()将提升到lua错误, 而且强制返回错误到命令调用者中, 而redis.pcall()将捕获错误, 并返回一个表示错误的lua表(表是lua中的一种key-value的类型)

    redis.call()redis.pcall()方法的参数就是redis命令形式的参数(就是以空格拆分出来)

    > eval  "return redis.call('set', 'foo', 'bar')"  0
    OK
    

    上面的脚本把字符串bar保存到foo这个键中. 然而它违反了EVAL命令的语义, 因为在脚本中使用的key都应该用KEYS数组来传递:

    > eval  "return redis.call('set', KEYS[1], 'bar')"  1 foo
    OK
    

    在执行之前, 必须分析所有redis命令, 以确定命令在哪些key上进行操作. 为了保证EVAL也是如此, keys必须明确传递. 这在很多时候是有用的, 特别是在redis集群环境中确保你的请求能否定向到合适的集群节点中.
    注意, 这不是强制的规则, 以便用户可以随意使用redis单实例配置, 但代价是写的脚本会与redis集群不兼容. (所以, 推荐使用KEYS来传递key)
    lua脚本返回的值是通过一系列的转换规则, 从lua类型转换成redis协议得来的.

    Lua和Redis之间的数据类型转换

    当lua脚本调用redis.call()redis.pcall()的时候, redis的返回值会被转换成lua的数据类型. 类似地, 当lua脚本返回结果的时候, lua的数据类型会被转换成redis的协议, 正因如此, lua脚本才能控制EVAL将返回什么类型给客户端.
    lua和redis类型之间存在一对一的转换关系, 下表展示了所有的转换规则

    Redis to Lua转换表

    • Redis integer reply -> Lua number
    • Redis bulk reply -> Lua string
    • Redis multi bulk reply -> Lua table
    • Redis status reply -> Lua table(只有一个属性ok, 对应status的值)
    • Redis error reply -> Lua table(只有一个属性err, 对应error的值)
    • Redis Nil bulk reply -> Lua false boolean type
    • Redis Nil multi bulk reply -> Lua false boolean type

    Lua to Redis转换表

    • Lua number -> Redis integer reply
    • Lua string -> Redis bulk reply
    • Lua table(array) -> Redis multi bulk reply(如果是array, 会被截断到第一个nil的位置)
    • Lua table(只有一个ok属性) -> Redis status reply
    • Lua table(只有一个err属性) -> Redis error reply
    • Lua boolean false -> Redis Nil bulk reply

    还有一个额外的Lua-to-Redis的规则, 但是没有相对应的Redis-to-Lua规则:

    • Lua boolean true -> Redis integer 1 replay

    也有两个重要的规则需要注意:

    • Lua有一个数值类型, Lua numbers. 整数和浮点数都没有区别. 所以redis通常是把lua numbers转换成integer replies, 移除了小数点部分. 所以如果你想要在lua脚本中返回一个浮点数, 正确的方式是返回一个字符串类型, 就像redis自己做的那样(ZSCORE命令就是如此)
    • 转换lua数组成redis协议的时候, 会在遇到nil后就停止转换.

    下面是一些转换的示例:

    > eval  "return 10"  0
    (integer) 10
    
    > eval  "return {1, 2, {3, "hello world!"}}"  0
    1) (integer) 1
    2) (integer) 2
    3) 1) (integer) 3
       2) "hello world!"
    
    > eval  "return redis.call('get', 'foo')"  0
    "bar"
    

    在下面的例子中, 我们能看到浮点数和包含nil值的数组是怎么样被处理的:

    > eval  "return {1, 2, 3.3333, 'foo', nil, 'bar'}"  0
    1) (integer) 1
    2) (integer) 2
    3) (integer) 3
    4) "foo"
    

    正如你看到的, 3.333被转换成了3, 字符串bar也不会被返回, 只因为nil在它前面

    返回Redis类型的帮助方法

    有两个帮助方法, 用于从lua中返回redis类型

    • redis.error_reply(error_string) 返回一个错误回复. 这个方法仅仅返回一个包含err属性的table
    • redis.status_reply(status_string) 返回一个状态回复. 这个方法仅仅返回一个包含ok属性的table

    使用帮助方法和直接返回一个指定格式的table并没有区别, 所以下面的两种方式是等价的:

    > return {err="My Error"}
    > return redis.error_reply("My Error")
    

    脚本的原子性

    Redis使用相同的Lua解释器来运行所有的命令. Redis也保证脚本以原子的方式执行: 当一个脚本正在执行时, 其他的脚本或者redis命令都不会执行. 这语义和MULTI/EXEX类似.
    然而这也就意味着执行慢脚本会非常糟糕. 创建快脚本并不是件困难的事情, 因为脚本开销非常低. 但是如果你打算使用慢脚本, 你就应该知道当执行慢脚本的时候, 其他客户端都不能再执行命令了.

    错误处理

    正如已经提到的, 如果redis.call()执行了错误的命令, 那么将停止执行并返回一个错误. 在某种程度上使得明显知道错误是由脚本生成的:

    > del foo
    (integer) 1
    > lpush foo a
    (integer) 1
    > eval  "return redis.call('get', 'foo')"  0
    (error) ERR Error running script (call to f_6b1bf486c81ceb7edf3c093f4c48582e38c0e791): ERR Operation against a key holding the wrong kind of value
    

    如果使用redis.pcall(), 错误则不会被抛出, 但是会返回一个指定格式的lua table类型数据.

    带宽和EVALSHA

    EVAL命令要求你在每次执行脚本的时候都发送一次脚本体. redis有一个内部的缓存机制, 因此它不会每次都重新编译脚本, 不过在很多场合, 支付额外的带宽开销可能不是最佳的选择.
    EVALSHA的执行很像EVAL, 但是EVALSHA的第一个参数是脚本的SHA1摘要, 而不是脚本主体. 它的表现如下:

    • 如果服务器缓存中匹配SHA1摘要的脚本, 那么就执行这段脚本
    • 如果服务器缓存中没有匹配到SHA1摘要的脚本, 那么就会返回一个错误

    例如:

    > set  foo  bar
    OK
    > eval  "return redis.call('get', 'foo')"  0
    "bar"
    > evalsha  6b1bf486c81ceb7edf3c093f4c48582e38c0e791  0
    "bar"
    > evalsha  ffffffffffffffffffffffffffffffffffffffff  0
    (error) `NOSCRIPT` No matching script. Please use [EVAL](/commands/eval).
    

    客户端代码库通常会优化地发送EVALSHA命令, 即使事实上是调用EVAL命令. 在接收到NOSCRIPT错误后再调用EVAL命令.
    将键和参数作为附加的EVAL参数传递在此上下文中也非常有用, 因为脚本字符串保持不变, 并且可以由Redis有效地缓存.

    脚本缓存语义

    执行的脚本能够保证永久保存在redis实例的脚本缓存中, 这就意味如果EVAL在一个redis实例中执行了, 那么后续的EVALSHA调用(用一个脚本摘要)都会成功.
    脚本能够缓存那么长的时间是因为, 一个好的应用程序不可能有那么多不同脚本而造成内存问题. 每个脚本概念上就像是一个新命令的实现, 甚至一个大型应用程序也只大概有几百个脚本. 即使应用程序的脚本被修改了多次, 脚本内存的使用也是微乎其微的.
    如果真的需要清除脚本的缓存, 那么可以显式调用SCRIPT FLUSH命令, 它将完全刷新脚本缓存, 删除到目前为止执行的所有脚本.

    脚本命令

    Redis提供了控制脚本子系统的脚本命令.

    • SCRIPT FLUSH
      这个命令用于强制redis刷新清除脚本缓存.

    • SCRIPT EXISTS sha1 sha2 … shaN
      这个命令用来查询脚本缓存是否存在. 这个命令的参数是脚本SHA1摘要列表, 它将返回1或者0的数组, 而1表示存在, 0表示不存在.

    • SCRIPT LOAD script
      这个命令是将指定的脚本注册到redis脚本缓存中.

    • SCRIPT KILL
      这个命令用于终止运行时间过长(达到配置的最大脚本执行时间)的脚本.当且仅当这个脚本没有执行过任何写操作时,这个命令才生效.

    展开全文
  • 说来也巧,redis的大老板给了你解决这种问题的方法,那就是Lua脚本,而且redis的最新版本也支持Lua Script debug,这应该也是未来Redis的一 个发展趋势,要想学好Redis,必会Lua Script。。。 作为一门过程型动态...

    编辑器软件LuaStudio

    一:Lua脚本

          说来也巧,redis的大老板给了你解决这种问题的方法,那就是Lua脚本,而且redis的最新版本也支持Lua Script debug,这应该也是未来Redis的一

    个发展趋势,要想学好Redis,必会Lua Script。。。

    作为一门过程型动态语言,Lua有着如下的特性

    1、变量名m没有类型,值才有类型,变量名在运行时可与任何类型的值绑定。

    2、语言只提供唯一一种数据结构,称为表(Table),它混合了数组、hash。可以使用任何类型的值作为key和value,提供了一致且富有表达力的表构造语法,使得Lua很适合描述复杂h和数据。

    3、函数s是一等类型,支持匿名函数和正则w尾递归

    4、支持词法定界、和闭包。

    5、提供thread类型和结构化的协程(coroutine)机制,在此基础上可方便实现协作式多任务。

    6、运行期能b编译字符串形式的程序文本并载入虚拟机执行。

    7、通过元表和元方法提供动态元机制,从而允许程序运行时根据需要改变或扩充语法设施的内定语义。

    8、能方便利用表和动态元机制实现基于原型的面向对象模型。

    有趣的是,官网上还提供了一个视频教程教你如何进行Debug操作。。。 【https://redis.io/topics/ldb】 youtube上面的视频,要是被墙了,记得

    上VPN哦。。。淘宝上不知道有没有售卖这种同款的吸顶灯~~~

     

    二:使用Redis-Cli Lua Script 解决几个灵活性问题

     

    1. Lua语法的问题

        lua是一门编程语言,所以这个就已经超出了redis本身的范畴,如果大家想好好学习一下,可以看下http://www.lua.org/ 的官网,然后下载一下玩一玩。

     

    比如这里我下载了一个windows版本的lua 编译器,具体语法上就不细说了。。有了这个主题,我们再进行下一个环节。

     

    2. Eval的使用

    EVAL script numkeys key [key ...] arg [arg ...]

       首先大家一定要知道eval的语法格式,其中:

       <1> script:     你的lua脚本

       <2> numkeys:  key的个数

       <3> key:         redis中各种数据结构的替代符号

       <4> arg:         你的自定义参数

     

    ok,可能乍一看模板不是特别清楚,下面我可以用官网的小案例演示一下:

    eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 username age jack 20

     

    上面这一串代码大概是什么意思呢? 第一个参数的字符串就是script,也就是lua脚本。2表示keys的个数,KEYS[1] 就是 username的占位符, KEYS[2]就是

    age的占位符,ARGV[1]就是jack的占位符,ARGV[2]就是20的占位符,,以此类推,,,所以最后的结果应该就是:{return username age jack 20} 是不

    是有点像C#中的占位符:{0}呢??? 下面我在Redis中给大家演示一下:

    复制代码

    [root@localhost Desktop]# redis-cli
    127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 username age jack 20
    1) "username"
    2) "age"
    3) "jack"
    4) "20"
    127.0.0.1:6379> 

    复制代码

     

    通常境况下,我们不要在redis-cli中直接写lua脚本,这样非常不方便编辑,通常情况下我们都是把lua script放到一个lua文件中,然后执行这个lua脚本,比如

    下面这样:

     

    然后我们通过下面命令执行,这种方式和前面介绍的不一样,参数 --eval script  key1 key2 , arg1 age2 这种模式,key和value用一个逗号隔开就好了,

    最后我们也看到了,数据都出来了,对吧。

    [root@localhost Desktop]# redis-cli --eval /usr/redis/sbin/1.lua username age , jack 20
    1) "username"
    2) "age"
    3) "jack"
    4) "20"
    [root@localhost Desktop]# 

     

    三:实战

    下面我可以构思几个小案例通过lua解决。

     

    1. 通过lua脚本获取指定的key的List中的所有数据

    local key=KEYS[1]
    
    local list=redis.call("lrange",key,0,-1);
    
    return list;

     

    这里面的redis.call就是用来执行redis中list的lrange命令,接下来我通过lpush给person塞入三条数据,如下:

    [root@localhost Desktop]# redis-cli
    127.0.0.1:6379> lpush person mary jack peter
    (integer) 3
    127.0.0.1:6379> 

     

    然后我们来执行这个lua脚本,效果如下图,是不是很牛逼的感觉???

     

    有了这个1+1的效果,就可以玩些更复杂的操作。比如:

     

    2.根据外面传过来的IDList 做“集合去重”的lua脚本逻辑:

    复制代码

    local key=KEYS[1];
    local args=ARGV
    local i=0;
    local result={};
    
      for m,n in ipairs(args) do
    
        local ishit=redis.call("sismember",key,n);
    
        if(ishit) then
           table.insert(result,1,n);
        end
    
      end
    
    return  result;

    复制代码

     

    2. 找到hash中age小于指定值的所有数据,lua脚本如下:

    复制代码

    local result={};
    local myperson=KEYS[1];
    local nums=ARGV[1];
    
    local myresult =redis.call("hkeys",myperson);
    
    for i,v in ipairs(myresult) do
       local hval= redis.call("hget",myperson,v);
       redis.log(redis.LOG_WARNING,hval);
       if(tonumber(hval)<tonumber(nums)) then
          table.insert(result,1,v);
       end
    end
    
    return  result;

    复制代码

    展开全文
  • 用luac给lua脚本加密

    万次阅读 2018-08-22 11:15:16
    项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行。 下面是使用原生的lua解释编译字节码: 1、新建一个名为1.lua的文件,...

    项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行。
    下面是使用原生的lua解释器编译字节码:
    1、新建一个名为1.lua的文件,里面只有一句话print("Hello Lua"),新建一个空的out.lua脚本文件
    2、开始--运行--cmd
    3、luac -o out.lua 1.lua
    注: luac -o [编译后脚本名] [脚本名],必要时带上脚本路径,如:

     

    回车之后,再打开out.lua就可以看到编译好的字节码了(十六进制)

     

    然后实验一下,执行这个字节码脚本,可以看到lua原生的解释器可以直接解析luac编译出来的bytecode脚本,很方便!

     

    注意:这种加密是可以逆向的,可以使用unluac等开源项目/工具反编译回lua源码 

     逆向工具下载:

    https://download.csdn.net/download/liujiayu2/10619529 

    逆向方法:

    需要安装java环境
    运行cmd,切换到unluac.jar的目录
    输入java -jar unluac.jar 源文件路径(如果是和unluac.jar在同一目录可以只输入文件名)>目标文件路径
    例如:java -jar unluac.jar d:\testin.lua>d:\testout.lua
    源文件和目标文件和unluac.jar在同一目录的话: java -jar unluac.jar testin.lua>testout.lua
    反编译的文件可以直接用文本编辑器修改

    逆向结果:

     

    展开全文
  • Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&printable=yes上的做法,修改lua-5.1.4.tar.gz. 上的Makefile,编译过后会在/src...
  • lua脚本的加密和解密(GG游戏脚本)

    万次阅读 多人点赞 2018-05-10 10:44:38
    他们这种外挂很多都是用GG修改修改本地代码然后实现游戏里的透视变色自瞄之类的变态功能,有GG不行还得有脚本,这里的脚本就是LUA脚本.这种脚本我就不做多解释了自己可以去百度一下!意思就是你只要把这脚本放到GG上...
  • Slardar是一个基于 , 和的HTTP负载平衡,通过它您可以更新上游列表并运行lua脚本,而无需重新加载Nginx。 此捆绑包由UPYUN(又拍云)Inc.维护。 由于大多数nginx模块是由包维护者开发的,因此可以确保所有这些...
  • Redis Lua脚本调试

    2019-09-26 19:34:01
    从版本3.2开始,Redis包含一个完整的Lua调试,可以用来使编写复杂Redis脚本的任务...您可以使用Redis unstable来调试稍后在稳定版本的Redis中运行脚本,因此调试已经可用于实际术语。 Redis Lua调试,代号...
  • Lua脚本 Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的 Lua解释不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式 脚本的最佳...
  • 以下内容转载自...本篇我将对dummylua项目中的脚本运行基础架构的设计与实现进行介绍和解析,它包括了lua编译器基础架构以及虚拟机基础架构。过去...
  • 用于OBS的lua脚本,为定时内容(马拉松,超速运行等)提供热键控制的文本计时。 笔记 您可以取消暂停计时。 这将导致它向前快照,就好像从未暂停过一样。 这是为了解释马拉松中的意外停顿。 另外,您只能在暂停...
  • lua脚本学习笔记

    2015-01-20 16:48:44
    Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。Lua由...
  • 而核心语言是c++和lua, c++是一门编译型语言,所以运行效率非常高,但缺点是每次代码的一个小改动都得重新编译,这大大增加了项目的开发时间,也不适合需求多变的业务环境,而lua脚本语言正好能解决这种矛盾。...
  • 为了获得对抓取页面的更多控制并且不重复LUA脚本中的常见任务,我们需要一些JavaScript实用工具。 应该尽快加载它们,例如通过,以便正确地猴子修补一些标准浏览器实用程序。 此软件包中包含以下utils: window.__...
  • 这篇文章记录一下如何在MAC系统环境下,搭建LUA脚本最好的编码环境,具有强大的代码补全,而且可以编译运行。 这里使用到的还是sublime text编辑。下面开始进行详细的介绍: (1)下载sublime text 注意版本号为...
  • 在vs中调试lua脚本

    千次阅读 2013-11-13 01:24:28
     1)luaedit : 编辑断点和断点命中查看那些都让习惯用vs的人感到亲切,但是它只是在纯lua环境下的编辑,也就是说和期望程序运行中能借用它来调试脚本可能性不大(至少我没有试验出来),能用上的需要给lua脚本做...
  • 使用SWIG(简单包装程序和接口生成)工具,可以将C ++函数和类绑定到Lua api,从而可以在Lua脚本中调用它们。 这在将上层逻辑与下层应用程序分离时很有用,并在众多视频游戏和应用程序中使用。 另外,ofxLua提供...
  • Redis 使用单个 Lua 解释运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执 行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。这和使用 MULTI / EXEC 包 围...
  • add.lua脚本将新元素添加到过滤。 当它不存在时,它将创建过滤。 cas.lua执行“检查并设置”,如果元素已经存在,则不会添加。 如果添加了元素,则cas.lua将返回0;如果元素已经在过滤中,则cas.lua将返回1...
  • 最近在开发电商平台的子系统——储值卡系统,系统核心业务涉及到金额消费以及库存控制,因此为了解决...使用lua脚本 Redis 使用单个 Lua 解释运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执...
  • Lua是一种嵌入式的语言,其不仅可以作为一个独立的程序来运行,亦可以作为嵌入其他...解释负责程序和使用者的接口:具体的运行过程是从主程序中获取文件(Lua脚本文件)或者是字符串(Chunk),传给Lua标准库,...
  • 在 vs 中 调试 lua脚本

    千次阅读 2010-08-23 21:54:00
    1)luaedit : 编辑断点和断点命中查看那些都让习惯用vs的人感到亲切,但是它只是在纯lua环境下的编辑,也就是说和期望程序运行中能借用它来调试脚本可能性不大(至少我没有试验出来),能用上的需要给lua脚本做个...
  • 这篇文章记录一下如何在MAC系统环境下,搭建LUA脚本最好的编码环境,具有强大的代码补全,而且可以编译运行。 这里使用到的还是sublime text编辑。下面开始进行详细的介绍: (1)下载sublime text 注意...
  • 项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行。 下面是使用原生的lua解释编译字节码: 1、新建一个名为1.lua的文件...
  • 使用嵌入式Lua脚本用C语言编写的基于实体/组件的2D引擎。 描述 我的业余时间写的引擎。 我想做一个游戏,最后又做引擎...。 嘿,引擎很有趣。 用法 当前可以使用脚本和程序着色加载场景。 您可以运行和加载场景: ...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 372
精华内容 148
关键字:

lua脚本运行器