基本使用

* 行注释用--
* 数组和字典都是table,数组下标不是从0开始的,而是从1开始的
* 函数调用只有一个参数,并且这个参数是字符串字面量或者table构造器时,可以省略括号
* unpack函数最重要的使用场景就是generic call,即函数的动态参数调用
* 函数的多值返回。lua会根据调用场景来调整返回的结果数量
  1. 当函数调用作为一个语句时,忽略所有的结果
  2. 当函数调用作为一个表达式时,只保留第一个返回结果
  3. 只有当函数调用在一个表达式列表中是最后一个表达式时,我们会得到所有的返回值。这种表达式
     列表出现在4种结构中:mutiple assignment, arguments to function calls, table
     constructors, and return statements

常用操作

table.concat(array, ',') --连接,相当于join
table.insert(array, 1, 15) --添加元素,在位置1处添加15。若不带位置参数,则默认添加到最后
table.remove(array) --删除最后一个元素
table.remove(array, 1) --删除指定位置的元素

string.sub(str, start, stop) --包括start和stop
type() --返回一个变量的类型,table string number
tostring(v) --转换成字符串
tonumber(e[, base]) --转换成数字
repeat while --相当于do while,while部分可以用until

-- 判断table是否为空
if next (t) == nil then
  -- table t is empty
end -- if empty

redis中的使用

* KEYS ARGV 两个变量,分别存储需要操作的key和传递给脚本的参数,只能通过这两个变量传入参数
* 使用lua 5.1的版本
* redis.call()和redis.pcall()唯一区别在于它们使用不同的方式处理执行命令所产生的错误
* 脚本里使用的所有键都应该由KEYS数组来传递,一个特别重要的用途是确保redis集群可以将请求
  发送到正确的集群节点
* lua数据类型和redis数据类型之间存在着一一对应的转换关系
  1. redis状态回复转换成lua表,表内的ok字段包含了状态信息
  2. redis错误回复转换成lua表,表内的err域包含了错误信息
  3. redis的Nil回复和Nil多条回复转换成lua的布尔值false
  4. redis的单个回复转换为数字或字符串,多条bulk回复转换成lua表
* 脚本应该写成纯函数:
     对于同样的数据集输入,给定相同的参数,脚本执行的redis写命令总是相同的。脚本执行的操作
  不能依赖于任何隐藏(非显式)数据,不能依赖于脚本在执行过程中、或脚本在不同执行时期之间可能
  变更的状态,并且它也不能依赖于任何来自I/O设备的外部输入
* 为了防止不必要的数据泄漏进lua环境,脚本不允许创建全局变量,将脚本中用到的所有变量都使用
  local关键字定义为局部变量
* 加载了以下lua库:base, table, string, math, struct, cjson, cmsgpack, bitop,
  redis.sha1hex函数, redis lua debugger上下文中的redis.breakpoint和redis.debug函数
  其中struct, cjson和cmsgpack是外部库,其它的都是lua的标准库(redis 3.2)