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