Lua入门

1.6k 词

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

  1. 定义

        Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,几乎在所有操作系统和平台上都可以编译运行。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua并没有提供强大的库,这是由它的定位决定的,所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。

  1. 安装(centos7)

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

数据类型 描述
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 模拟出来
  4. Lua 垃圾回收

    • Lua 采用了自动内存管理
    • Lua 运行了一个垃圾收集器来收集所有死对象(即在Lua中不可能再访问到的对象)来完成自动内存管理的工作
    • Lua 实现了一个增量标记-扫描收集器,它使用这两个数字来控制垃圾收集循环:垃圾收集器间歇率和垃圾收集器步进倍率,这两个数字都使用百分数为单位 (例如:值100在内部表示1)
    • 垃圾收集器间歇率控制着收集器需要在开启新的循环前要等待多久。增大这个值会减少收集器的积极性。当这个值比 100 小的时候,收集器在开启新的循环前不会有等待。设置这个值为 200 就会让收集器等到总内存使用量达到 之前的两倍时才开始新的循环
    • 垃圾收集器步进倍率控制着收集器运作速度相对于内存分配速度的倍率。增大这个值不仅会让收集器更加积极,还会增加每个增量步骤的长度。不要把这个值设得小于100,那样的话收集器就工作的太慢了以至于永远都干不完一个循环。默认值是 200,这表示收集器以内存分配的”两倍”速工作