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会直接返回错误不会继续执行。