2019-01-12 16:49:12 weixin_42314225 阅读数 1410

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退出控制台

2019-09-10 23:39:35 qq_27142569 阅读数 24

在redis中使用lua

eval

eval 脚本内容 key个数  key列表 参数列表

结果如下:
在这里插入图片描述

redis-cli --eval

如果lua脚本较长,可以使用redis-cli --eval的方式:
新建lua.lua文件,在文件中输入:return KEYS[1]..ARGV[1]
在linux中执行:
redis-cli --eval 文件路径 keys , argvs
在这里插入图片描述
key和参数间需要使用逗号(,)隔开,并且需要占用空格

eval命令和- -eval参数的方式本质上是一样的,客户端将需要执行的lua脚本作为字符串发送给服务端,服务端将执行结果返回给客户端。

evalsha

使用evalsha执行lua脚本,首先需要将lua脚本加载到服务端(会常驻内存中),服务端会返回该脚本的SHA1值,evalsha命令使用SHA1作为参数直接可以执行对应脚本,避免每次发送Lua脚本的开销。

加载脚本

在linux中执行:redis-cli script load "$(cat 文件路径)"
在这里插入图片描述

执行脚本

在redis客户端执行:evalsha sha1值 key数量 key列表 参数列表
在这里插入图片描述

redis管理脚本

  • script load
    此命令用于将Lua脚本加载到Redis内存中
  • scripts exists sha1 [sha1 …]
    此命令用于判断sha1是否已经加载到Redis内存中,返回结果代表sha1[sha1…]被加载到Redis内存的个数
  • script flush
    此命令用于清除Redis内存已经加载的所有Lua脚本
  • script kill
    此命令用于杀掉正在执行的Lua脚本。 如果Lua脚本比较耗时, 甚至Lua脚本存在问题, 那么此时Lua脚本的执行会阻塞Redis, 直到脚本执行完毕或者外部进行干预将其结束。
    如果当前Lua脚本正在执行写操作, 那么script kill将不会生效。

Lua的Redis API

Lua可以使用redis.call函数实现对Redis的访问:

--set("db","redis")
redis.call("set", "db", "redis") 
--get("db")
redis.call("get", "db")

除此之外Lua还可以使用redis.pcall函数实现对Redis的调用, redis.call和redis.pcall的不同在于, 如果redis.call执行失败, 那么脚本执行结束会直接返回错误, 而redis.pcall会忽略错误继续执行脚本, 所以在实际开发中要根据具体的应用场景进行函数的选择。

参考:
Redis开发与运维

2017-08-02 09:56:15 javajiawei 阅读数 1846

       在这里我曾经介绍过在windows上面是如何实现批量的切流。因为windows终究不如linux上面可以使用shell脚本来的方便,因此这次在linux上面又实现了一遍(然后还发现,针对同一个报文,linux的执行速度要比之windows快上不少),这里有些注意的地方做一下记录。
       当然wireshark对于lua的支持应该在2.0版本之后了,较低的版本可能不会支持lua。对于一些linux默认的安装源一般来说,版本是比较低的。这里面建议的是源码安装,详细见这篇博客,我在centos7上面安装主要包括如下几点:1,安装libpcap;2,安装lua-devel;3,编译安装wireshark源码(可从官网下载)。然后确认wireshark支持lua ,同时确认init.lua文件中disable_lua = false
       这个时候基本就是可以执行lua脚本了,相应的命令为tshark -X lua_script:cutflow.lua -r allSite.pcap,这时候会发现执行的结果只是读取了pcap文件,并没有执行lua脚本,使用tshark -q -X lua_script:cutflow.lua -r allSite.pcap则出现如下的提示

Running as user “root” and group “root”. This could be dangerous.
tshark: Lua: Error during loading: [string
“/usr/local/share/wireshark/init.lua”]:44: dofile has been disabled
due to running Wireshark as superuser. See
https://wiki.wireshark.org/CaptureSetup/CapturePrivileges for help in
running Wireshark as an unprivileged user.

       导致上述问题的原因是由于我是在root用户下面执行该命令的,切换到非root用户下面执行tshark -X lua_script:cutflow_sjw.lua -r allSite2.pcap则会执行相应的lua脚本。然后在结合find等强大的命令,就可以批量操作了。
       本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里

2018-03-01 17:06:09 xiojing825 阅读数 1608

使用lua 脚本操作redis可减少与redis数据的连接次数,减少网络传输带来的时间浪费。在某些情景下,当我们需要对redis进行一系列的操作时我们可以使用lua。下面给出简单的示例。

redis-cli 运行lua 脚本

redis-cli -h host -p port -a password -n db –eval demo.lua k1 k2 , a1 a2

连接远程redis 并运行当前文件夹下的test.lua脚本。其中,-n 后接的参数为选择的redis db。 后面“k1 k2 , a1 a2” 的在lua 脚本中获取的方式是使用全局变量 KEYS 和 ARGV。

如果连接本地的redis运行脚本则可省略几个参数

redis-cli -n db –eval demo.lua k1 k2 , a1 a2

redis客户端命令行模式下运行lua脚本,使用eval 命令。如:

 121.8.164.91:6383> eval “return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}”

注意需要获取返回数据必须使用 return

PHP 连接redis运行lua

$lua = 'return KEYS[1]';
// 也可以使用 file_get_contents() 读取lua脚本内容
// $lua = file_get_contents('/tmp/demo.lua');
$data = new \Redis()->connect('192.168.0.1', '6383')->auth('123456')->select(2)->eval($lua ,['k1', 'k2','a1', 'a2'], 2);

lua 操作redis

lua 操作redis比较简单,使用 redis.call(order,argv1, $argv2…);
将redis使用命令行时的参数依次作为参数传入,即可。
如:
- 使用获取指定key的值

redis.call(‘GET’,’key_demo’);

  • 求多个zSet的并集,并存储为union_set。的

    redis.call(‘ZUNIONSTORE’, ‘union_set’, ‘zSet_1’, ‘zSet_2’, ‘zSet_3’);

  • 统计一个zSet中的元素个数

    redis.call(‘ZCARD’,’union_set’);

lua脚本示例

  • 统计union_set中元素个数
-- 注释,统计union_set中元素个数。如果大于10,则给zSetCountDes赋值'more then 10 ', 如果小于10,则给zSetCountDes赋值'less then 10'
local zSetCount = '';
local zSetCountDes = '';
zSetCount = redis.call('ZCARD','union_set');
if (zSetCount>10)
then
    zSetCountDes = 'more then 10';
else 
    zSetCountDes = 'less then 10';
end;
return zSetCountDes;
  • 遍历zSet中元素
local value = '';
local score = '';
local responseJson = '';
local zSetElement = redis.call('ZRANGE', 'zSet_1',0, 1, 'WITHSCORES');

for key,val in pairs(zSetElement) do
    paidCountKey = gameId .. '_' .. 'activation_paid_count';
    moneyCountKey = gameId .. '_' .. 'activation_paid_money_count';

    -- 奇数key 对应val是 value
    -- 偶数key 对应val是 score
    if (key%2==1)
    then
        value = val;
    else
        score = val;

    end;
    responseJson = responseJson .. value .. ':' .. score .. ',';

end;

-- 拼接成json字符串
responseJson = '{' .. string.sub(responseJson, 1, -2) .. '}';

return responseJson;

如果zSet_1中数据为:

1) "value_a"
2) "score_a"
3) "value_b"
4) "score_b"

则脚本返回的字符串为:”{\”value_a\”:\”score_a\”, \”value_b\”:\”score_b\”}

注意使用 redis.call(‘ZRANGE’, ‘zSet_1’,0, 1, ‘WITHSCORES’);获取zSet中数据时是table类型。此时奇数key 对应val 才是zSet中value 而紧接着的一个偶数key对应的 val 才是value对应的score值。
如使用命令:

121.8.164.91:6383> zrange zSet_1 0 1 withscores

可看到如下数据:

1) "value_a"
2) "score_a"
3) "value_b"
4) "score_b"

则在lua中使用for key,val in pairs(zSetElement) do … end; 遍历时key和val 会是这样:

key    val

1      "value_a"
2      "score_a"
3      "value_b"
4      "score_b"
2017-06-25 18:02:04 tinyfar 阅读数 345
Lua代码符合ANSI C标准,只要有C编译器的开发环境就能跑Lua。
虽说只要有C编译器就能跑Lua,但是单片机的环境太简单,有些C标准的内容仍旧无法支持。
Lua的官网是:www.lua.org
移植
1) 把 lua.c 和 luac.c 删除,这两个是一个Lua Shell,和平台相关,单片机中一般没用。
2) 对内存敏感的项目可以替换掉 lauxlib.c 文件里 l_alloc 函数调用的 free 和 realloc 函数。
3) loslib.c 和系统相关,单片机中最多跑RTOS,所以这个文件可以删除。
4) liolib.c 中使用了标准文件操作fopen、fclose、fread、fwrite等函数。虽然有些单片机支持这些函数,但还是要自己重定向这些函数,而且在单片机中一般也不用文件来操作IO,所以这个文件可以删除。
5) 如果删除了 loslib.c 和 liolib.c,那么在 linit.c 中要把 loadlibs 数组中相关的元素注释掉。这样调用 luaL_openlibs 时就不会加载这两个库了。
6) 在luaconfig.h 中有 luai_writestring 和 luai_writeline 两个宏,这两个宏关系到了 lua 中 print 的输出,需要针对平台重定向,一般定向到调试串口就行。还有个 luai_writestringerrir 宏,定义了 lua 如何报错,可以定义到调试串口,也可以定义到log文件,或者两者兼有。
完成以上6步,lua就移植完成了。

简单运行Lua代码

阅读数 13095

没有更多推荐了,返回首页