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


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容