8:Lua腳本開發(fā)

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(字符串):把字符串還原成為表


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容