目录
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。
网友评论