lua的应用领域都有哪些

lua的应用领域都有哪些,第1张

lua的应用优势:

Lua 最大的好处就是小,绝对的小,可以嵌入任何程序而我们几乎可以忽略为此增加的大小。

C/C++交互,灵活使用,性能优佳。

lua还有一个重要的优点是语法简单,可以用做数据描述,甚至构造DSL。

用一门真正的语言来“描述”来项目,多了更多的灵活性。

缺点:

唯一不满的是没有处理 UTF-8 的逻辑。所有的字符串当作字节流处理。

先讲讲我知道的一些应用。

首先是在i OS下写游戏,《愤怒小鸟》就是用lua写的;同时,也好多用其它语言在为Iphone写游戏的程序员,添加lua到游戏开发中去,让过程更简单。当然,Lua最著名的应用是在暴雪公司的网络游戏《魔兽世界》中----在网上可以找到好多用lua做的wow小工具。

然后是一些小的程序,这个和我的目标一致,一些简单的测试用例可以用lua来写,比如可以在百度找得到的‘康泰串口程序’,还在百度文库发现一篇,有在用lua开发测量仪器上位机测试程序的例子(好处是用c写完一些固定的调用后,用lua简单配置一下,又是另外一个测试程序,写完就可以用)。

Unified Configuration Interface

讲点其它细节。

lua是动态语言,它的解释器现在有用各种主流语言完成的各种版本,c、java应有尽有。你的程序需要做config吗?lua应该是个不错的选择。或者,找现成的lua解释器过来,你可以再添加好你的库,完全直接执行脚本也行。

有人把它和python作比较,可能是应用领域的关系,那个家伙讲,他觉得lua会比python好用。在lua的官网可以看到他们吹水记录,不贴连接了。

网上下的某PPT里这么讲,Lua最引人注目的特点:

--以极小 的体积和简单 的语法提供相对全面的功能。

--以简洁 的API实现与宿主语言最方便 的接口。

Lua 没有打算被用来进行大型的程序设计,相反,Lua 定位于中小型程序设计,通常是作为大型系统的一部分,常用于一个或少数程序员开发的情况,甚至是由非程序员进行的开发。所以,Lua 避免了过分的冗余和过多的人为限制。如果你不希望一个对象的内部结构被访问,那么就不要去访问它们。

FreeSWITCH中的lua *** 作小结

lua中设置当前通道变量

方法一:

session:setVariable("fullName", "xxxxx");--需判断session是否为空

方法二:

local uuid =getUUID(callerid);

local res=api:executeString("uuid_setvar " uuid " fullName ""xxxxxxx")

该处设置的变量可以是通道中本没有的变量,设置完了后,在其他地方就可以引用该变量。

lua中设置全局通道变量(在varsxml中设置)

local ucall_ip = api:executeString("global_setvar qt_ucall_ip_port 192168032:9090");

获取当前的通道变量

local callee_num=session:getVariable("qt_ucall_callee");

获取全局通道变量

local ucall_ip = api:executeString("global_getvar qt_ucall_ip_port");

获取当前会话uuid

session:get_uuid()

获取当前路径

--USwitch的当前安装目录

syspath = tostring(api:execute("global_getvar", "base_dir"));

使用uuid_transfer将当前对话的两个号码同时转入会议中

local trf1="uuid_transfer " guestuuid " -both " conferenceNum;

OutputConsoleLog("info" , scriptname ": try to get guestNum to conference,command is{"trf1"}");

api:executeString(trf1);

外呼方法总结:

originate user/11103139316095XX

originate sofia/external/139316095XX@192168234 &playback(calloutmusic/welcometoyoump3)

originate loopback/139316095XX&playback(calloutmusic/20110126164156mp3)

在lua脚本中放一段录音

session:streamFile("notondutywav");

判断会话是否已建立

session:ready()==true

挂断当前会话

session:hangup();

将当前会话休眠一段时间

session:sleep(5000);

发起>

1 不在任务栏, lua层调用wnd:SetAppWindow(false)

2 托盘图标, 网上搜索下Shell_NotifyIcon, 里面需要一个窗口句柄, 有两种方法

a 用bolt的窗口, 开个lua到c的接口, 把bolt的窗口句柄传回去, wnd:GetWndHandle()

b 在c这边创建一个隐藏窗口, 用这个隐藏窗口的句柄

Redis 本身已经提供了丰富的命令,但是直接用来处理一些复杂业务时可能还不够方便,会有一定的局限性。因此,在 Redis26 版本开始提供了对 Lua 脚本的支持,Lua 脚本的使用还是比较广泛的,比如商品秒杀、分布式锁等,使用 Lua 脚本可以带来以下的好处:

为了让例子更加的贴近实际应用,这里实现一个简单版的分布式锁。这里先用 Jedis *** 作。

上边详细的介绍了分布式锁的实现过程,以及可能出现的问题,最终,我们决定删除锁的 *** 作使用 Lua 脚本实现,对应的脚本如下:

Lua 脚本中执行具体的 Redis 命令,需要使用 rediscall() 方法, KEYS 表示客户端发起脚本执行命令时携带的 Redis key 的一个集合, ARGV 则是其它参数的一个集合,主意下标从1开始。结合我们的业务,这里的 KEYS[1] 则表示 lock , ARGV[1] 则是一个随机字符串。整个脚本的含义就是,如果客户端传递的 lock 的 value 和 Redis 中存储的一致,就删除 lock 。

Lua 脚本的语法还是比较简单的,具体内容可以自行学习。

前边的准备工作基本结束了,文章开始说过执行脚本有两种途径,下边我们具体来看:

这里使用 jediseval() 发送脚本到 Redis 服务器执行,后两个参数分别是 key 的集合,以及 value 参数的集合。

先将脚本以文件形式放到 Redis 里,例如这样:

然后通过如下命令让 Redis 服务器缓存脚本:

script load 命令会在 Redis 服务器缓存 Lua 脚本,并且脚本内容经过 SHA-1 签名算法处理后,会返回脚本内容的 SHA1 校验和的编码,然后在端调用时,传入编码字符串作为参数,这样 Redis 服务器就会执行对应缓存的脚本了,就不用了每次发送具体的脚本内容了。

还有两个比较有用的命令:

除了使用上边的命令缓存脚本、生成脚本的 SHA1 校验和的编码,还可以使用 Jedis 实现,但最终的 SHA1 编码内容是不同的:

实际的项目中,可能更多的会在 SpringBoot 项目中整合 Redis,此时执行 Lua 脚本的基本流程如下:

核心的类就是 DefaultRedisScript ,它实现了 RedisScript 接口。 execute() 方法最后一个参数是可变类型的,用来传递多个 value 参数。初次执行 execute() 方法时,其内部会自动缓存 Lua 脚本到 Redis 服务器;同时每次执行脚本时会根据脚本内容自动计算出对应的 SHA1 校验和的编码,去匹配、执行缓存的脚本。

具体的 SHA1 校验和的编码,可以在 execute() 方法执行后,使用 redisScriptgetSha1() 查看。使用 SpringBoot 方式 执行 Lua 脚本生成的 SHA1 校验和的编码和前边直接使用 Jedis 生成的一致。

无论用那种方式在 Redis 中使用 Lua 脚本,其中的原理都是类似的。

以上就是关于lua的应用领域都有哪些全部的内容,包括:lua的应用领域都有哪些、什么是lua、FreeSWITCH中的lua *** 作小结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9738167.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存