Lua 高效的轻量级脚本语言
Redis允许开发者使用Lua语言编写脚本传到Redis中执行。在lua脚本中可以调用大部分的redis命令。
优点:
1. 数据类型:
Lua是一个动态类型语言,一个变量可以存储任何类型的值。
2. 变量:
Lua变量分为全局变量和局部变量。全局变量无需声明就可以直接使用,默认值为Nil.
在redis脚本中不能使用全局变量,只允许使用局部变量以防止脚本之间相互影响。声明局部变量的方法为local变量名。
3. 注释:
单行 -- 单行注释
多行
--[[
这是一个多行注释
]]
4. 赋值:
支持多重赋值
Local a,b = 1,2
Local c,d =1,2,3 (3被舍弃)
5. 操作符:
数学操作符:+、-、*、/、%、—(一元操作符,取负)、^(幂运算符号)
比较操作符:==、~=(与==结果取反)、<、>、<=、>=
逻辑运算符:not、and、or
not:根据操作数的真和假相应的返回false和true(只要操作数不是nil或false为真)
and:a and b a是真返回b,否则返回a
or : a or b a是假则返回a,否则返回b
连接操作符:..
Print(‘hello’..’ ’ ..’world!’) -- ‘hello world!’
取长度操作符:#
Print(#’hello’) -- 5
6. If语句
If exp1 then
Xxx
Elseif exp2 then
Xxx
Else
Xxx
End
;可省略,不强制要求缩进
7. 循环语句
Lua支持while、repeat和for循环语句
While exp1 do
Xxx
End
Repeat
Xxx
Until exp2
For 变量= 初值,终值,步长 do
Xxx
End
8. 表类型
表是Lua中唯一的数据结构,可以理解为关联数组,任何类型的值都可以作为表的索引。
a = {}
a[‘field’] = ‘value’
print(a.field)
people={
name=’bob’
age=29}
a={}
a[1]=’bob’
a[2]=’jeff’
相当于
a = {‘bob’,’jeff’}
Lua约定数组的索引是从1开始的,而不是0;
迭代器:ipairs/pairs
前者只会从索引1开始递增遍历到最后一个值不为nil的证书索引。
后者会遍历所有值不为nil的索引。
9. 函数
Function(参数列表)
函数体
End
Local square = function(num) -- 如果没有参数,()也不能省略
Return num*num
End
相当于
Local function square (num)
Return num*num
End
Lua标准库
Lua标准库中提供了很多实用的函数,redis支持大部分lua标准库。
1. string库
string.len(string) 获取字符串长度
string.lower(string) 转换为小写
string.upper(string) 转换为大写
string.sub(string,start[,end]) 获取子字符串
2. Table库
Table.concat(table[,sep[,i[,j]]]) 将数组转换为字符串
Table.insert(table,[pos,] value) 向数组中插入元素
Table.remove(table[,pos]) 从数组中弹出一个元素
3. Math库
4. 其他库
Redis通过cjson库和cmsgpack库提供了对JSON和MessagePack的支持。Redis自动加载了这两个库,在脚本中可以分别通过cjson和cmsgpack两个全局变量来访问对应的库。
Redis与Lua
1. 在脚本中调用redis命令
reids.call(‘set’,’foo’,’bar’)
local value = redis.call(‘get’,’foo’) -- value的值为bar
redis.pcall与redis.call功能相同,唯一的区别是当命令执行出错时redis.pcall会记录错误并继续执行,而redis.call会直接返回错误,不会继续执行。
2. 从脚本中返回值
使用return语句将值返回给客户端。
脚本相关命令
Redis> EVAL “return redis.call(‘set’,KEYS[1],ARGC[1])” 1 foo bar
Redis> get foo
“bar”
Redis的脚本执行此是原子的。所有命令必须等到脚本执行完成后才能执行,为了防止某个脚本执行时间过长导致redis无法提供服务,redis提供了Lua-time-limit参数限制脚本的最长运行时间,默认为5秒。