Redis进阶:Lua初尝试
Lua是一门脚本语言,可以编写Lua脚本到Redis中执行
如果需要需要调试Lua脚本,可以到Lua官网下载Lua,然后在本地cmd控制台来调试命令
【使用Lua脚本的优点】
1.减少网络开销。Redis每条命令都需要进行网络传输,特别是命令条数很多的情况。
2.原子操作。脚本都会作为一个整体执行,中间不会有其他命令插入。
3.复用。会永远存储在Redis中
比较类似Sql里面的存储过程
【Lua数据类型】
1.空类型 nil
2.布尔类型 boolean
3.数字类型 number
4.字符串类型 string
5.表类型 table。 既可以当数组也可以当字典
6.函数类型 function。
【Lua变量】
分为全局变量和局部变量。
注意:全局变量没有声明和未声明之分,只有nil和非nil之分。
删除全局变量的方法就是将它赋值为nil。
局部变量和全局变量的区别是局部变量声明时需要加上一个local。
比如
//全局变量 a=2 //局部变量 local b=2
局部变量和全局变量默认都为nil。
【变量声明要求】
1.不能数字开头
2.只能包含字母,数字和下划线
3.不能和关键字相同
【注释】
--单行注释 --[[ 多行注释 ]]
【赋值】
一一对应原则
local a, b=1, 2 --这里a=1,b=2 local c,d=1,2,3 --这里c=1,d=2,3被舍弃 lcoal e,f=1 --这里e=1,f=nil
注意:
Lua处理表达式时,会先计算值
例如
local a={2,3,4} local i=1 local i,a[i]=i+1,5
第三行遇到表达式,会先将i=1带入,所以原式变为
local i,a[1]=2,5
所以
a={5,3,4}
【操作符】
1.注意:如果字符串是数字,那么和数字相加会输出数字之和
print('1'+1)
会输出2,与其他语言相反,其他语言会转化成字符串,输出11
2.不等于的写法为 ~=
3.注意:虽然字符串的内容是数字时可以直接和数字相加,但不代表两者相等,比如
print('1'==1)
这个表达式是false,如果想要比较的话,应该将字符串转化成数字
print(1==tonumber('1'))
或者
print(tostring(1)=='1')
【逻辑运算】
注意:
1.操作符的运算与其他语言不同
not : 根据操作数真假返回false和true
对于a oper b
and : a为真则返回b,为假则返回a
or : a为真则返回a,为假则返回b
2.对于操作数而言,只要不为nil或者false就认为是真。
0和空字符也认为是真。
3.逻辑操作符支持短路。也就是false and foo(),则一定会返回false
4.连接操作符是 ..(其他语言一般是+)
比如
print('hello'..' '..'world') --hello world
6.取长度运算符#
print(#'hello') --5
7.if语句
表达式为
if 条件 then 语句块 elseif 条件 then 语句块 else 语句块 end
注意:
在Redis中exists指令的返回值1和0分别代表存在或者不存在。但在Lua指令中1和0全为真,
所以判断一个键是否存在的Lua指令不能写成
if redis.call('exists','key') then exists=true ..
上面的表达式恒为真,应该写成
if redis.call('exists','key')==1 then exists=true ..
8.循环语句
while 条件 do 语句块 end
repeat:
repeat
语句块
until 条件
for:
for 变量=初值,终值,步长 do 语句块 end
步长默认为1,可以省略
实例
local sum=0 for i=1,100 do sum=sum+i end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY