Lua介紹
? ? ? ? Lua是一個高效、簡潔、輕量級、可擴(kuò)展的腳本語言,可以很方便的嵌入到其它語言中使
用,Redis從2.6版支持Lua。
1.使用腳本的好處
1:減少網(wǎng)絡(luò)開銷
2:原子操作:Redis會把腳本當(dāng)作一個整體來執(zhí)行,中間不會插入其它命令
3:復(fù)用功能
2. Lua的數(shù)據(jù)類型
Lua是一個動態(tài)類型的語言,一個變量可以存儲任何類型的值,類型有:
1:空:nil,也就是還沒有賦值
2:字符串:用單引號 或者 雙引號 引起來
3:數(shù)字:包含整數(shù)和浮點型
4:布爾:boolean
5:表:表是Lua唯一的數(shù)據(jù)結(jié)構(gòu),既可以當(dāng)數(shù)組,也可以做Map,或被視為對象
6:函數(shù):封裝某個或某些功能
7:userData:用來將任意 C 數(shù)據(jù)保存在 Lua 變量中,這樣的操作只能通過 C API
8:Thread:用來區(qū)別獨(dú)立的執(zhí)行線程,它被用來實現(xiàn) coroutine (協(xié)同例程)
3.變量
Lua的變量分成全局變量和局部變量。
1:全局變量
全局變量無需聲明即可直接使用,默認(rèn)值是nil。在Redis腳本中不允許使用全局變量,以
防止腳本之間相互影響。
2:局部變量,聲明方法為:local 變量名
3:變量名必須是非數(shù)字開頭,只能包含字母、數(shù)字和下劃線,不能是保留關(guān)鍵字,如:
and break do else elseif end false for function if in local nil
not or repeat return then true until while
4:Lua的變量名是區(qū)分大小寫的
5:局部變量的作用域為從聲明開始到所在層的語句塊結(jié)尾
?注釋
1:單行:--
2:多行:--[[ 開始,到 ]] 結(jié)束
賦值
Lua支持多重賦值,如:local a,b = 1,2,3
操作符
1:數(shù)學(xué)操作符:+、-、*、/、%、- 取反、^ 冪運(yùn)算;如果操作數(shù)是字符串,會自動轉(zhuǎn)換成數(shù)
字進(jìn)行操作
2:比較操作符:==、~=、〉、>=、<、<=;比較操作符不會轉(zhuǎn)換類型,如果類型不同進(jìn)行比
較,會返回false;可以手動使用tonumber或者tostring進(jìn)行轉(zhuǎn)換
3:邏輯操作符:and、or、not
4:連接操作符:..;用來連接兩個字符串
5:取長度操作符:#,例如:print(#’helloworld’)
6:操作符的優(yōu)先級跟其它編程語言是類似的
If語句
1:格式是:
if 條件 then
elseif 條件 then
else
end
2:注意:在Lua中,只有nil和false才是假,其它類型的值均被認(rèn)為是真
循環(huán)語句
Lua支持for、while和repeat三種循環(huán)語句。
1:for語句格式是:
for 變量=初值,終值,步長 do
end
步長可以省略,默認(rèn)是1
2:增強(qiáng)for循環(huán)的格式是:
for 變量1,變量2…,變量N in 迭帶器 do
end
3:while語句的格式是:
while 條件 do
end
4:repeat語句的格式是:
repeat
until條件
5:使用break來跳出循環(huán)塊
表類型
可以當(dāng)作數(shù)組或者M(jìn)ap來理解,比如:
1:a = {},報一個空表賦值給a
2:a[key]=value,把value賦值給表a中的字段key
3:a={ key1=‘value1’, key2=‘value2’ }
4:引用的時候,可以使用 . 操作符,如: a.key1
5:如果用索引來引用,跟數(shù)組是一樣的,如:a[1],注意Lua的索引是從1開始
6:可以使用增強(qiáng)for循環(huán)來遍歷數(shù)組,如:
for k,v in ipairs(a) do
print(k)
print(v)
end
其中的ipairs是Lua的內(nèi)置函數(shù),實現(xiàn)類似迭帶器的功能,從索引1開始遞增遍歷到最后一個不為nil的
整數(shù)索引。類似的還有一個pairs,用來便利非數(shù)組的表值,它會遍歷所有值不為nil的索引。
7:也可以使用for循環(huán)來按照索引遍歷數(shù)組,如:
for i=1,#a do
end
函數(shù)
1:定義格式為:
function(參數(shù)列表)
end
2:注意:就算沒有參數(shù),括號也不能省略
3:形參實參個數(shù)不用完全對應(yīng),如果想要得到所有的實參,可以把最后一個形參設(shè)置成…
4:函數(shù)內(nèi)返回使用return
Lua的標(biāo)準(zhǔn)庫
Lua的標(biāo)準(zhǔn)庫提供了很多使用的功能,Redis支持其中大部分,主要有:
1:Base:提供一些基礎(chǔ)函數(shù)
2:String:提供用于操作字符串的函數(shù)
3:Table:提供用于表操作的函數(shù)
4:Math:提供數(shù)據(jù)計算的函數(shù)
5:Debug:提供用于調(diào)試的函數(shù)
在Redis中常用的標(biāo)準(zhǔn)庫函數(shù)
1:string.len(string)
2:string.lower(string)
3:string.upper(string)
4:string.rep(s, n):返回重復(fù)s字符串n次的字符串
5:string.sub(string,start[,end]),索引從1開始,-1表示最后一個
6:string.char(n…):把數(shù)字轉(zhuǎn)換成字符
7:string.byte (s [, i [, j]]):用于把字符串轉(zhuǎn)換成數(shù)字
8:string.find (s, pattern [, init [, plain]]):查找目標(biāo)模板在給定字符串中出現(xiàn)的位
置,找到返回起始和結(jié)束位置,沒找到返回nil
9:string.gsub (s, pattern, repl [, n]):將所有符合匹配模式的地方都替換成替代字符
串。并返回替換后的字符串,以及替換次數(shù)。四個參數(shù),給定字符串,匹配模式、替代字
符串和要替換的次數(shù)
10:string.match (s, pattern [, init]):將返回第一個出現(xiàn)在給定字符串中的匹配字符
串,基本的模式有:. 所有字符,%a字母,%c控制字符,%d數(shù)字,%l小寫字母,%p 標(biāo)點符
號字符,%s 空格,%u 大寫字母,%w 文字?jǐn)?shù)字字符,%x 16進(jìn)制數(shù)字等
11:string.reverse (s):逆序輸出字符串
12:string.gmatch (s, pattern):返回一個迭代器,用于迭代所有出現(xiàn)在給定字符串中的匹
配字符串
13:table.concat(table[,sep[,i[,j]]]):將數(shù)組轉(zhuǎn)換成字符串,以sep指定的字符串分割,
默認(rèn)是空,i和j用來限制要轉(zhuǎn)換的表索引的范圍,默認(rèn)是1和表的長度,不支持負(fù)索引
14:table.insert(table,[pos,]value):向數(shù)組中插入元素,pos為指定插入的索引,默認(rèn)是
數(shù)組長度加1,會將索引后面的元素順序后移
15:table.remove(table[,pos]):從數(shù)組中彈出一個元素,也就是刪除這個元素,將后面的
元素前移,返回刪除的元素值,默認(rèn)pos是數(shù)組的長度
table.sort(table[,sortFunction]):對數(shù)組進(jìn)行排序,可以自定義排序函數(shù)
16:Math庫里面常見的:abs、ceil、floor、max、min、pow、sqrt、sin、cos、tan等
17:math.random([m[,n]]):獲取隨機(jī)數(shù),如果是同一個種子的話,每次獲得的隨機(jī)數(shù)是一樣
的,沒有參數(shù),返回0-1的小數(shù);只有m,返回1-m的整數(shù);設(shè)置了m和n,返回m-n的整數(shù)
18:math.randomseed(x):設(shè)置生成隨機(jī)數(shù)的種子
其它庫
除了標(biāo)準(zhǔn)庫外,Redis還會自動加載cjson和cmsgpack庫,以提供對Json和MessagePack的支
持,在腳本中分別通過cjson和cmsgpack兩個全局變量來訪問相應(yīng)功能
1:cjson.encode(表):把表序列化成字符串
2:cjson.decode(string):把字符串還原成為表
3:cmsgpack.pack(表):把表序列化成字符串
4:cmsgpack.unpack(字符串):把字符串還原成為表