美文网首页
lua脚本学习

lua脚本学习

作者: 温岭夹糕 | 来源:发表于2024-07-31 23:07 被阅读0次

    目录

    链接地址

    1.环境安装

    lua官网linux源码安装教程

    curl -L -R -O https://www.lua.org/ftp/lua-5.4.7.tar.gz
    tar zxf lua-5.4.7.tar.gz
    cd lua-5.4.7
    make all test
    

    测试安装

    lua -v
    //或者
    lua -i
    

    2.快速上手

    2.1注释

    单行

    --
    

    多行

    --[[
     多行注释
     多行注释
     --]]
    

    2.1变量

    使用print函数打印
    默认情况下,变量总认为是全局,变量默认值为nil

    > b=10
    > print(b)
    10
    >print(a)
    nil
    

    哪怕是语句块或函数都是,下面是定义并执行了hi函数,然后输出c=5

    > function hi()
    >>   c=5
    >> end
    > hi()
    > print(c)
    5
    

    局部变量需要使用local显式声明

    > function hi()
    >>  local c=5
    >>  d=1
    >> end
    > hi()
    > print(c,d)
    nil 1
    

    语句赋值和go相似,支持swap赋值

    > a,b=1,2
    > b,a=a,b
    > print(a,b)
    2   1
    

    有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table
    其中table表可以理解为一个关联数组(map),使用[]或点符号来访问元素

    > tb = {}
    > tb["a"]=1
    > tb["b"]=2
    > print(tb["a"])
    1
    > print(tb.b)
    2
    > for key,val in pairs(tb) do
    >>   print(key,val)
    >> end
    a   1
    b   2
    

    与go的map不同的是这个下标是可以数字和字符串混合的

    2.2 循环

    while循环

    while(condition)
    do
       statements
    end
    

    for 循环类似python,下面意思表示var 从exp1变化到exp2,每次变化exp3步长,适用于数字

    for var=exp1,exp2,exp3 do  
        <执行体>  
    end  
    

    如果是table类型需要借助ipairs函数,类似go for range循环

    a = {"one", "two", "three"}
    for i, v in ipairs(a) do
        print(i, v)
    end 
    

    repeat循环类似其他语言的do while语法,只是until是停止条件

    repeat
       statements
    until( condition )
    

    同时循环也可嵌套

    2.4流程控制

    if语句

    if( 布尔表达式 1)
    then
       --[ 在布尔表达式 1 为 true 时执行该语句块 --]
    
    elseif( 布尔表达式 2)
    then
       --[ 在布尔表达式 2 为 true 时执行该语句块 --]
    
    elseif( 布尔表达式 3)
    then
       --[ 在布尔表达式 3 为 true 时执行该语句块 --]
    else 
       --[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
    end
    

    2.5函数

    lua的函数可以和go类似可以有多个返回值,用end表示结束,支持可变参数

    function add(...)  
    local s = 0  
      for i, v in ipairs{...} do   --> {...} 表示一个由所有变长参数构成的数组  
        s = s + v  
      end  
      return s  
    end  
    print(add(3,4,5,6,7))  --->25
    

    2.5运算符

    区别于go:

    • 没有自增运算符
    • 不等于为
    ~=
    
    • 逻辑运算符为and / or / not
    • 字符串连接运算符为减号-
    • 一元运算符为井号#,表示返回字符串或表长度

    3.Redis中使用lua脚本

    3.1首要注意

    Lua脚本在Redis中是以原子方式执行的,在Redis服务器执行EVAL命令时,在命令执行完毕并向调用者返回结果之前,只会执行当前命令指定的Lua脚本包含的所有逻辑,其它客户端发送的命令将被阻塞
    因此实际使用lua进行redis命令编写中:

    • LUA脚本不宜编写一些过于复杂了逻辑,必须尽量保证Lua脚本的效率,否则会影响其它客户端。
    • 在Lua脚本中不要编写function函数,整个脚本作为一个函数的函数体
    • 在脚本编写中声明的变量全部使用local关键字。
    • 在集群中使用Lua脚本要确保逻辑中所有的key分到相同机器,也就是同一个插槽(slot)中,可采用Redis Hash Tag技术

    3.2EVAL命令

    redis使用eval命令执行lua脚本

    EVAL luascript numkeys key [key ...] arg [arg ...]
    
    • luascript :Lua 脚本
    • numkeys :指定的Lua脚本需要处理键的数量,其实就是 key数组的长度。
    • key :传递给Lua脚本零到多个键,空格隔开,在Lua 脚本中通过 KEYS[INDEX]来获取对应的值,其中1 <= INDEX <= numkeys。
    • arg:是传递给脚本的零到多个附加参数,空格隔开,在Lua脚本中通过ARGV[INDEX]来获取对应的值,其中1 <= INDEX <= numkeys。

    相关文章

      网友评论

          本文标题:lua脚本学习

          本文链接:https://www.haomeiwen.com/subject/jetohjtx.html