基本使用 * 行注释用-- * 数组和字典都是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)