lua脚本学习

目录

链接地址

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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容