lua相关知识
-
nginx与lua的开发(28)lua是一个简洁、轻量、可扩展的脚本语言。nginx+lua开发充分的结合Nginx的并发处理epoll优势和lua的轻量实现简单的功能切高并发的场景。 1.安装lua 如果是centos7版本之上会自带lua,版本5.1.4。lua没有安装 yum install lua 2.安装LuaJIT 安装LuaJIT环境,比自带的lua解析器扩展模块多并且高效。 cd /opt/download wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz tar -zxvf LuaJIT-2.0.2.tar.gz cd LuaJIT-2.0.2 make install PREFIX=/usr/local/LuaJIT export LUA
-
Windows下编译 Lua 5.3.0最近想研究一下lua,平时常用的都是windows,所以原本打算使用lua for windows ,然而最新的版本却只有lua 5.1,再加上莫名其妙下载不了【墙的错】,所以决定在windows上自己编译一下lua源码。 ps.祝自己期末不挂科~ 系统:windows 10 编译器:Visual Studio 2015 源码:lua-5.3.0 <!--more--> 步骤如下: 下
-
安装Nginx Lua环境安装Nginx Lua模块环境准备:$ yum -y install pcre-devel$ yum -y install openssl openssl-devel下载所需文件亦可参考官方安装指南:lua-nginx-module Installation这是我总结的安装,供参考:需要最新版的Nginx,LuaJIT,ngx_devel_kit,lua-nginx-module等安装文件:NginxLuaJIT Lua或者LuaJIT都是可以的,但是出于性能的考虑,推荐安装LuaJITngx_devel_kitlua-nginx-module参考命令下载:$ curl -O http://nginx.org/download/nginx-1.10.1.tar.gz$ curl -O http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz$ curl -L -O https://github.com/simpl/ngx_devel_kit/archive/v
-
lua热更框架之XLua框架介绍xLua是当下最流行的unity热更方案之一,作者是腾讯的车雄生前辈,自2016年初推出以来,已经在腾讯的多款游戏项目上应用,目前xLua已经开源到了GitHub。xLua最大的特色是不仅支持纯lua脚本热更,更是可以做 C# 代码的bug hotfix,即平时开发时使用C#,项目上线后,如果突然发现有bug,可以直接用lua去修复出bug的地方,原理就是通过[Hotfix]特性标记然后在IL逻辑层判断修改逻辑,使程序去执行更新后的lua逻辑代码而不是走之前的C#逻辑。 框架优势与别的lua热更插件不同的是,别的lua热更方案基本都是项目中需要热更的部分一开始就需要用lua语言去实现,xlua的HotFix出现之前,基本所有的lua热更方案都是如此,这样做的不足之处有:lua的性能是不如C#的,这是最主要的,此外,有些项目刚开始做时都是用C#的,如果已经用C#做完了,这时再去接入lua,把需要逻辑热更的C#代码重新用lua去实现,这样就麻烦了不少,费时费力,而且两种语言配合开发时还容易碰上
lua相关课程
-
Cocos2d-x初体验之Lua篇 Lua以其出色的跨平台性和速度最快的嵌入式脚本语言,当仁不让的占据了游戏插件开发的头把交椅。你也想制作一个和大脚一样闻名天下的工具和游戏么?快来吧
讲师:徐波老师 入门 20184人正在学习
lua相关教程
- 1. Splash Lua 脚本方法与相关属性介绍 上一节我们简单实用了 Splash 服务,并基于默认的脚本完成了头条热点新闻数据的爬取。我们现在来深入学习 Splash 中 lua 脚本的使用。
- 深入使用 Splash 服务 上一小节我们基于 Splash 服务以及 Scrapy-Splash 插件完成了今日头条热点数据的抓取,今天我们来详细地介绍 Splash Lua 脚本中支持的相关方法与 Splash 对象属性,并解决上一小节留下的作业题。
- 2.4 第三方插件 基于第三方插件,Nginx 可以完成各种各样复杂的功能,全方位满足程序员的想法。比如在 Nginx 中引入 lua 模块,可以实现对 Http 请求更细粒度的限制,包括限速、限流、校验认证等等。后续,在 Nginx 上发展出来的 OpenResty 已经应用到了微服务网关方向。
- 2.2 Redis 分布式锁 面试官提问: 既然谈到了分布式锁的应用场景,在实战环境是如何实现分布式锁的呢?题目解析:目前分布式锁最主要有三种实现方式:(1)基于 Redis 集群的模式;(2)基于 Zookeeper 集群的模式;(3)基于 DB 数据库的模式本章节只关注 Redis 的部分,核心思路是通过 setnx 指令,实例: public static void wrongWayLock(Jedis jedis, String prefix_key, String id, int expire_time) { // 加锁 Long result = jedis.setnx(prefix_key, id); if (result==1){ // 如果加锁成功,设置过期时间 jedis.expire(prefix_key,expire_time); } }加锁步骤主要分为两步:(1)通过 setnx 指令加锁,setnx 的含义是 set if not exist,即如果 redis 不存在已有的 prefix_key ,则写入 prefix_key ,设置对应 value=id,并且调用返回为 1,如果已有 prefix_key ,则不写入并且返回非 1.(2)通过 expire 指令,设置过期时间,如果 prefix_key 代表的锁一直没有删除,则在定时后自动失效,防止产生死锁的情况。上述代码并不完美,其中 setnx() 和 expire() 函数并不是原子操作,如果执行 setnx() 指令之后,redis 集群出现网络抖动或者在线服务本身异常,导致后续 expire() 指令并没有执行,prefix_key 代表的锁并没有被加上过期时间,还是有产生死锁的可能性,我们对上述代码进行改造,实例: public static boolean setLock(Jedis jedis, String prefix_key, String id, int expire_time) { if(jedis.set(prefix_key, id, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expire_time) == 1) { return true; //加锁成功 } return false; //加锁失败 }这种方案是将加锁和设置过期时间合并为一个步骤,一次 set,是原子操作。另外还有诸多开源代码解决这个问题,例如通过开源 lua 脚本,基于 redis 集群进行改造。既然有加锁的过程,就有操作执行结束之后释放锁的过程,实例: public static void unLock(Jedis jedis, String prefix_key, String id){ //如果在集群中存在prefix_key的值,并且和之前配置的id相同 if(id.equals(jedis.get(prefix_key))){ //删除prefix_key键值对 jedis.del(prefix_key); } }使用分布式锁都是为了应对高并发的场景,高并发场景下,上述代码存在严重的并发执行问题。例如第一行 if 判断完成之后,其他线程已经提前进入条件判断并且执行了 del 操作,当前线程再执行 del 操作就不合理。还是出现了没有保证操作原子性的问题,通用的解决方案是通过 lua 脚本的 eval() 函数,首先获取锁对应的 value(即我们的 id ),如果相等才删除锁,lua 脚本能保证原子性,实例: public boolean unlock(String prefix_key,String request){ //lua脚本 String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; Long result = jedis.eval(script, Collections.singletonList(prefix_key), Collections.singletonList(id)); if (result == 1){ return true ; } return false; }
- 1.1 Splash对象属性 来看默认的 Splash lua 脚本:function main(splash, args) assert(splash:go(args.url)) assert(splash:wait(0.5)) return { html = splash:html(), png = splash:png(), har = splash:har(), }end其中这个 splash 参数非常重要,从该参数中我们可以调用 Splash 对象的一些重要属性和方法来控制加载的过程。我们来看看 Splash 对象最常用的几种属性:args 属性:如 splash.args.url 是获取请求渲染的 url;js_enabled 属性:这个属性可以用来允许或者禁止执行 js 代码。例如下面的 lua 脚本:function main(splash, args) splash.js_enabled = true assert(splash:go(args.url)) assert(splash:wait(0.5)) local title = splash:evaljs("document.title") return { title=title }end得到的结果为:Splash Response: Objecttitle: "今日头条"如果我们禁止执行 js 代码,即设置 splash.js_enabled = false,则渲染页面时会报错: 禁止js后,执行js语句报错resource_timeout 属性:该属性用于设置页面加载时间,单位为秒。如果设置为0或者 nil (相当于 Python 中的 None),表示不检测超时;images_enabled 属性:用于设置是否加载图片,默认为 true,表示加载页面图片,设置为 false 后,表示禁止加载图片,这有可能会改变页面的布局,使用时要注意。另外,注意 Splash 使用了缓存,如果头一次设置 true 并加载页面,之后再设置为 false 后加载页面仍然会有图片显示,这正是缓存的影响。只需要重启 splash 服务即可显示正常;小米网站,禁止加载图片plugins_enabled 属性:该属性用于控制浏览器插件是否开启,默认情况下为 false;scroll_position 属性:该属性用于控制页面上下或者左右滚动。它是一个字典类型,key 为 x 表示页面水平滚动位置,key 为 y 表示页面垂直滚动的位置;我们继续拿头条的热点新闻做实验。之前默认访问时的页面如下:默认访问头条热点新闻从抓取的网页上看,一共获取了12篇热点新闻。接下来我们使用 scroll_position 属性来将页面滚动滚动,测试的 lua code 如下:function main(splash, args) assert(splash:go(args.url)) assert(splash:wait(2)) splash.scroll_position = {y=1000} assert(splash:wait(2)) splash.scroll_position = {y=1500} assert(splash:wait(5)) return { png=splash:png(), html=splash:html() }end这里我做了2次页面滚动,渲染的效果如下: 滚动后的效果可以看到,页面确实出现了滚动,且我们获取的新闻数据已经变多了,从渲染的页面上看,我们已经抓到了36条数据。
- 4. 开源和免费 Nginx 和老大哥 Apache 一样开源且免费。在如今的时代,开源才能有力地成长,免费才能让更多的企业和个人开发者使用。 当然 Nginx 也有它的商业版本 Nginx plus,它有着更为丰富的功能和应用场景。然而免费版本的功能已经足够强大,加上第三方层出不穷的插件模块,几乎能实现各种业务功能,再加上配合第三方的语言集成(perl、lua等),对于绝大多数企业和个人来说已经完全足够。当然,Nginx 的优点绝对不止于此。它最核心地功能是:在支持高并发请求的同时保持高效的服务。而这一点正是广大开发者,也是各大企业迫切需要满足的需求,以应对日益庞大的国内互联网用户群体。
lua相关搜索
-
label
labelfor
label标签
lambda
lambda表达式
lamda
lang
last
latin
latin1
layers
layui
leave
left
leftarrow
legend
length
lengths
length函数
less