Lua脚本:
使用脚本的好处:
a、减少网络开销:有些代码需要向Redis发送N次请求,使用脚本后完成同样的功能只需要向Redis发送一次请求即可,减少了往返延时。
b、原子性:Redis会将脚本作为一个整体来执行,中间不会被其他命令插入。换句话说,当执行脚本时,不会出现竞争,进而不需要考虑事务的问题。
c、复用:客户端发送的脚本会永久的存储在Redis中,这就意味着其他客户端也可以使用此脚本。
1、数据类型
lua是一个动态类型语言,一个变量可以存储任何类型的值。以下是使用Redis时经常用到的变量:
空(nil):空类型只包含一个值,那就是nil。所有未赋值的变量或表的字段都是nil;
布尔(boolean):布尔类型包含true和false两个值;
数字(number):整数和浮点类型的都是用数字表示;
字符串(string):存储字符串,使用单引号和双引号都可以;
表(table):既可以当数组,又可以当字典;
函数(function):函数在Lua中是一等值,可以存储在变量中、作为函数的参数或者返回值。
2、变量
变量分为全局变量和局部变量。全局变量可以不用赋值直接使用,默认为nil。
注意:在Redis脚本中不能使用全局变量,只能使用局部变量,为了防止脚本之间相互影响。声明局部变量的方法为 local 变量名。
3、注释
单行注释:--
多行注释:-- [[内容]]
4、操作符
1、数学操作符:+、-、*、/、%(取模)
2、比较运算符:==(类型和数值是否相同)、~=(与==相反)、<、<=
3、逻辑运算符:
not 根据操作数的真假相应的返回false和true
and a and b 中如果a为真则返回b,否则返回a
or a and b 中如果a 为假则返回a,否则返回b
注意:只要操作数不是nil或false,逻辑运算符就认为操作数为真,否则为假。即使是0或者空字符串也被认为是真。
5、if语句
if 条件表达式 then
语句块
else if 条件表达式 then
语句块
else
语句块
end
7、循环语句
(1)while 条件表达式 do
语句块
end
(2)repeat
语句块
util 条件表达式
(3)
①for 变量 = 初值,终值,步长 do
语句块
end
②for 变量1,变量2...变量N in 迭代器 do
语句块
end
8、函数
function (参数列表)
函数体
end
在脚本中调用Redis命令:
redis.call("set","foo","bar");
local value = redis.call("get","foo");
说明:Redis还提供了redis.pcall函数。和redis.call函数不同的是,当命令执行错误时redis.pcall会记录错误并继续执行,而redis.call会直接返回错误不会继续执行。