0%

Lua入门

遇到个问题,有个亿级别的网站,实现访问黑名单白名单控制,搜了下解决方案,基本都是nginx+lua实现,特此记录!

一、概念

      Lua是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
      Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

二、介绍

  1. 数据类型
数据类型 描述
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)
boolean 包含两个值:false和true
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表
  1. 特性

    • i,j = j,i – 交换变量的值
    • table默认初始索引一般以 1 开始
    • table访问时支持table[i]table.i
    • 在Lua中false和nil为假,true和非nil(包括0)为真
    • #返回字符串或表的长度,如#”Hello” 返回 5
    • for var=exp1,exp2,exp3 do <执行体> end:var 从exp1变化到exp2,每次变化以exp3(可选,默认为1)为步长递增var,并执行一次”执行体”
    • 字符串的定义方式
    • 单引号’string’
    • 双引号”string”
    • [[string]]
  2. 协程

    • Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西
    • 一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行
    • 在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起
    • 协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同
  3. 面向对象

    • 用table来描述对象的属性
    • 用function可以用来表示方法
    • LUA中的类可以通过table+function模拟出来

三、垃圾回收

      和大多开发语言一样,Lua也采用了自动内存管理,它运行了一个垃圾收集器来收集所有死对象(即在Lua中不可能再访问到的对象)来完成自动内存管理的工作。具体就是Lua实现了一个增量标记-扫描收集器,它使用这两个数字来控制垃圾收集循环:垃圾收集器间歇率和垃圾收集器步进倍率,这两个数字都使用百分数为单位。

  • 垃圾收集器间歇率控制着收集器需要在开启新的循环前要等待多久。增大这个值会减少收集器的积极性。当这个值比100小的时候,收集器在开启新的循环前不会有等待。设置这个值为200就会让收集器等到总内存使用量达到 之前的两倍时才开始新的循环
  • 垃圾收集器步进倍率控制着收集器运作速度相对于内存分配速度的倍率。增大这个值不仅会让收集器更加积极,还会增加每个增量步骤的长度。不要把这个值设得小于100,那样的话收集器就工作的太慢了以至于永远都干不完一个循环。默认值是 200,这表示收集器以内存分配的”两倍”速工作

二、安装

  1. Linux下安装(centos7)

    1
    2
    3
    tar zxf lua-5.3.5.tar.gz
    cd lua-5.3.5
    make linux test
    • 查看安装是否完成 lua -v
  2. Mac下安装

    • cd /usr/local/src
    • sudo wget https://www.lua.org/ftp/lua-5.3.5.tar.gz
    • sudo tar -zxvf lua-5.3.5.tar.gz
    • cd lua-5.3.5
    • sudo make macosx test
    • sudo make install
    • lua -v