8:Lua脚本开发

Lua介绍

        Lua是一个高效、简洁、轻量级、可扩展的脚本语言,可以很方便的嵌入到其它语言中使

用,Redis从2.6版支持Lua。

1.使用脚本的好处

1:减少网络开销

2:原子操作:Redis会把脚本当作一个整体来执行,中间不会插入其它命令

3:复用功能

2. Lua的数据类型

Lua是一个动态类型的语言,一个变量可以存储任何类型的值,类型有:

1:空:nil,也就是还没有赋值

2:字符串:用单引号 或者 双引号 引起来

3:数字:包含整数和浮点型

4:布尔:boolean

5:表:表是Lua唯一的数据结构,既可以当数组,也可以做Map,或被视为对象

6:函数:封装某个或某些功能

7:userData:用来将任意 C 数据保存在 Lua 变量中,这样的操作只能通过 C API

8:Thread:用来区别独立的执行线程,它被用来实现 coroutine (协同例程)

3.变量

Lua的变量分成全局变量和局部变量。

1:全局变量

全局变量无需声明即可直接使用,默认值是nil。在Redis脚本中不允许使用全局变量,以

防止脚本之间相互影响。

2:局部变量,声明方法为:local 变量名

3:变量名必须是非数字开头,只能包含字母、数字和下划线,不能是保留关键字,如:

and break do else elseif end false for function if in local nil

not or repeat return then true until while

4:Lua的变量名是区分大小写的

5:局部变量的作用域为从声明开始到所在层的语句块结尾

 注释

1:单行:--

2:多行:--[[ 开始,到 ]] 结束

赋值

Lua支持多重赋值,如:local a,b = 1,2,3

操作符

1:数学操作符:+、-、*、/、%、- 取反、^ 幂运算;如果操作数是字符串,会自动转换成数

字进行操作

2:比较操作符:==、~=、〉、>=、<、<=;比较操作符不会转换类型,如果类型不同进行比

较,会返回false;可以手动使用tonumber或者tostring进行转换

3:逻辑操作符:and、or、not

4:连接操作符:..;用来连接两个字符串

5:取长度操作符:#,例如:print(#’helloworld’)

6:操作符的优先级跟其它编程语言是类似的

If语句

1:格式是:

if 条件 then

elseif 条件 then

else

end

2:注意:在Lua中,只有nil和false才是假,其它类型的值均被认为是真

循环语句

Lua支持for、while和repeat三种循环语句。

1:for语句格式是:

for 变量=初值,终值,步长 do

end

步长可以省略,默认是1

2:增强for循环的格式是:

for 变量1,变量2…,变量N in 迭带器 do

end

3:while语句的格式是:

while 条件 do

end

4:repeat语句的格式是:

repeat

until条件

5:使用break来跳出循环块

表类型

可以当作数组或者Map来理解,比如:

1:a = {},报一个空表赋值给a

2:a[key]=value,把value赋值给表a中的字段key

3:a={ key1=‘value1’, key2=‘value2’ }

4:引用的时候,可以使用 . 操作符,如: a.key1

5:如果用索引来引用,跟数组是一样的,如:a[1],注意Lua的索引是从1开始

6:可以使用增强for循环来遍历数组,如:

for k,v in ipairs(a) do

print(k)

print(v)

end

其中的ipairs是Lua的内置函数,实现类似迭带器的功能,从索引1开始递增遍历到最后一个不为nil的

整数索引。类似的还有一个pairs,用来便利非数组的表值,它会遍历所有值不为nil的索引。

7:也可以使用for循环来按照索引遍历数组,如:

for i=1,#a do

end

函数

1:定义格式为:

function(参数列表)

end

2:注意:就算没有参数,括号也不能省略

3:形参实参个数不用完全对应,如果想要得到所有的实参,可以把最后一个形参设置成…

4:函数内返回使用return

Lua的标准库

Lua的标准库提供了很多使用的功能,Redis支持其中大部分,主要有:

1:Base:提供一些基础函数

2:String:提供用于操作字符串的函数

3:Table:提供用于表操作的函数

4:Math:提供数据计算的函数

5:Debug:提供用于调试的函数

在Redis中常用的标准库函数

1:string.len(string)

2:string.lower(string)

3:string.upper(string)

4:string.rep(s, n):返回重复s字符串n次的字符串

5:string.sub(string,start[,end]),索引从1开始,-1表示最后一个

6:string.char(n…):把数字转换成字符

7:string.byte (s [, i [, j]]):用于把字符串转换成数字

8:string.find (s, pattern [, init [, plain]]):查找目标模板在给定字符串中出现的位

置,找到返回起始和结束位置,没找到返回nil

9:string.gsub (s, pattern, repl [, n]):将所有符合匹配模式的地方都替换成替代字符

串。并返回替换后的字符串,以及替换次数。四个参数,给定字符串,匹配模式、替代字

符串和要替换的次数

10:string.match (s, pattern [, init]):将返回第一个出现在给定字符串中的匹配字符

串,基本的模式有:. 所有字符,%a字母,%c控制字符,%d数字,%l小写字母,%p 标点符

号字符,%s 空格,%u 大写字母,%w 文字数字字符,%x 16进制数字等

11:string.reverse (s):逆序输出字符串

12:string.gmatch (s, pattern):返回一个迭代器,用于迭代所有出现在给定字符串中的匹

配字符串

13:table.concat(table[,sep[,i[,j]]]):将数组转换成字符串,以sep指定的字符串分割,

默认是空,i和j用来限制要转换的表索引的范围,默认是1和表的长度,不支持负索引

14:table.insert(table,[pos,]value):向数组中插入元素,pos为指定插入的索引,默认是

数组长度加1,会将索引后面的元素顺序后移

15:table.remove(table[,pos]):从数组中弹出一个元素,也就是删除这个元素,将后面的

元素前移,返回删除的元素值,默认pos是数组的长度

table.sort(table[,sortFunction]):对数组进行排序,可以自定义排序函数

16:Math库里面常见的:abs、ceil、floor、max、min、pow、sqrt、sin、cos、tan等

17:math.random([m[,n]]):获取随机数,如果是同一个种子的话,每次获得的随机数是一样

的,没有参数,返回0-1的小数;只有m,返回1-m的整数;设置了m和n,返回m-n的整数

18:math.randomseed(x):设置生成随机数的种子

其它库

除了标准库外,Redis还会自动加载cjson和cmsgpack库,以提供对Json和MessagePack的支

持,在脚本中分别通过cjson和cmsgpack两个全局变量来访问相应功能

1:cjson.encode(表):把表序列化成字符串

2:cjson.decode(string):把字符串还原成为表

3:cmsgpack.pack(表):把表序列化成字符串

4:cmsgpack.unpack(字符串):把字符串还原成为表


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容