Lua脚本优点
1、 减少网络开销;多次请求在脚本中,一次即可完成
2、 原子操作
3、 复用
4、 可实现热切换
Lua测试
$ redis-cli --eval /qpth/test.lua rate.limiting:127.0.0.1 , 10 3
详解:
/qpth/test.lua 脚本路径
rate.limiting:127.0.0.1 要操作的键,在脚本中可用key[1]获取
10 3 “,”后为参数,可用ARGV[1]和ARGV[2]获取
Lua语法
数据类型
nil 空值,所有为负值的变量和字段都为nil
boolean 包括true、false
number 整点和浮点
string 二进制,单双引号是相同的,可包含转义字符
table Lua脚本中唯一的数据结构,可当数组、可当字典
function 函数,可储存在变量中,可为函数的参数或返回值
变量
全局变量:无须声明,直接使用,默认值为nil
注:redis脚本中不可使用全局变量,以防脚本之间相互影响
局部变量
声明:
local c --声明一个局部变量,默认值为nil
注释:
单行注释 -- 注释
--[[
这是一个多行注释
]]
赋值
Lua支持多重赋值
local a, b = 1, 2 --a的值为1,b的值为2
local a, b = 1, 2, 3 -- a=1 b=2 3舍弃
local a, b c = 1, 2 -- a=1,b=2 c=nil
操作符(五类)
1、 数学操作符。 + - * / %(取模) -(取负) ^幂操作符
数学操作符的操作数会自动转换为数字
print(‘1’+1) --2
2、 比较操作符
== 比较值和类型是否相同
~= 与==的结果正好相反
<, >, <=, >= 小于、大于、小于等于、大于等于
tonumber(‘1’) 转换为数字
tostring(1) 转换为字符串
3、 逻辑操作符
not 取反
and a and b中,如果a是false,则返回a,否则返回b
or a or b中,如果a是true,则返回a,否则返回b
4、 连接操作符
‘hello’ .. ‘world’ ..用于连接字符串,会自动把数字转换字符串
5、 取长度操作符(可取字符串和表的长度)
prinf(#’hello’) -- 5
注:Lua脚本中只有nil和false才是假,其余值包括空字符串和0都被认为是真值
循环语句
while 条件表达式 do
语句块
end
repeat
语句块
until 条件表达式
for 变量=初值,终值,步长 do
语句块
end
for 变量1,变量2,…,变量N in 迭代器 do
语句块
end
表类型
定义方式:
a = {}
a[‘field’] = ‘value’
prinf(a.field) --‘value’
people = { --也可以这样定义
name = ‘Bob’,
age = 29
}
a = {}
a[1] = ‘Bob’
a[2] = ‘Jeff’
也可以如下:
a = {‘Bob’,’Jeff’}
注:Lua数组的索引是从1开始的,而不是0
函数
function(num)
函数体
end
可以将其赋值给一个局部变量
local square = function (num)
return num*num
end
在脚本中调用redis命令
redis.call(‘set’,’foo’,’bar’)