LUA脚本百度百科
学习redis发现支持lua脚本,特简单学习并记录下lua入门级的知识
可参考菜鸟教程
1.Windows下环境变量配置
下载链接
下载完成后解压到指定文件夹,不要携带中文路径,难免发生点什么
然后【电脑】-【属性】-【高级系统设置】-【高级】-【环境变量】-【系统变量】-【找到Path】-【新建】-【将刚刚解压后的路径添加到Path下(lau.exex的所在目录)】-【确认保存】
打开命令行,输入lua54,进行lua命令行,环境即算配置成功
2. 数据类型
2.1 nil
表示空,如果对一个变量赋值nil,表示删除该变量,不是释放对应变量指向值的内存
2.2 string
2.2.1 表示字符串的三种方式
1)''中的内容表示字符串
2)""中的内容表示字符串
3)[[]]双括号中的内容也表示字符
2.2.2 字符串连接
使用…可以将字符串进行连接
2.2.3 字符串简单操作的函数(简单的几个)
函数名称 | 解释 |
---|---|
string.upper() | 字符串全部大写 |
string.lower() | 字符串全部小写 |
string.len() | 也可以使用 #"666"计算字符串长度 |
string.reverse() | 字符串反转 |
2.3 number
lua只有双精度类型的数值
2.4 boolean
此类型只有true和false两种值,nil也是false,数值0是true
2.5 userdata
todo 待补充
2.6 table
通过构造表达式来创建table
table = {"tomato", "potato", "cabbage"}
for k, v in pairs(table) do
print(k .. ":" ..v)
end
table[1] = "tomato1"
for k, v in pairs(table) do
print(k .. ":" ..v)
end
table = {k1="tomato", k2="potato", k3="cabbage"}
for k, v in pairs(table) do
print(k.. ":" ..v)
end
2.7 function
定义一个函数提供使用
function f1(n)
if n == 0 then
return 1
else
return f1(n - 1) * n
end
end
print(f1(3))
函数也可以被当做变量传递
f2 = f1
print(f2(4)) 等价于 print(f1(4))
函数也可以被当做参数传递到方法内
function f2(tab, f3)
for k,v in pairs(tab) do
print(f3(k,v))
end
end
tab = {k1="key1", k2="key2"}
f2(tab, function(k, v)
return k.. "=" ..v
end)
2.8 thread
todo 待补充
3. 变量
可以通过type(变量),获取变量的类型
lua中的变量有三种,不做任何声明则默认是全局变量
- 全局变量
a = 10 无论这个赋值语句执行在任何一个地方,他都是全局变量,除了先被局部变量声明过,再进行赋值的情况 - 局部变量
function f1()
a = 100
local b = 10
-- 对局部变量b重新赋值
b = 100
end
f1()
print(a, b)
- 表中的域
tab1 = {}
变量批量赋值
x, y = 10, 20
print(x, y)
--变量交换值
x, y = y, x;
print(x, y)
4. 流程控制
流程控制无非就是 if 、else、嵌套if else
if type(nil) == nil then
print("nil == nil")
else
print("nil ~= mil")
end
注意type(nil)计算出值的类型是string,所以才不等于nil
-- 结果是nil
print(type(nil))
--结果是string
print(type(type(nil)))
5. 循环体
lua的循环体有三种
5.1 for循环
循环控制在语句内控制
for i = 1, 10 do
print(i)
end
tab = {k1="tomato", k2="potato", k3="cabbage"}
for i, v in pairs(tab) do
print(i, v)
end
5.2 while循环
先判断条件,在执行语句,也是在语句内控制
a = 10
while a > 0 do
print("666")
a = a - 1
end
5.3 repeat util
先执行语句,直到条件为true时,跳出循环,语句内控制
a = 10
repeat do
print("666")
a = a -1
end
until a < 0
6. 运算符
操作符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余 |
^ | 幂 |
- | 数值符号取反 |
// | 整除运算 |
关系运算符 | 描述 |
---|---|
== | 等于 |
~= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
逻辑运算符 | 描述 |
---|---|
and | 逻辑与 |
or | 逻辑或 |
not | 逻辑非 |
特殊运算符 | 描述 |
---|---|
… | 连接两个字符串 |
# | 计算字符串的长度 |
运算符优先级从高到低 |
---|
^ |
not - (unary) |
* / % |
+ - |
… |
< > <= >= ~= == |
and |
or |
7. table表
表的构造
-- 初始化表
tab = {}
-- 指定值
tab[1] = "tomato"
--table简单的方法 remove
print(tab[1])
table.remove(tab, 1)
print(tab[1])
8. Redis调用lua脚本
EVAL script numkeys key [key …] arg [arg …]
script lua脚本
numkeys 键的数量
key 键可能会多个
arg 值可能会多个
eval "return KEYS[1]" 1 key
eval "return ARGV[1]" 0 value
eval "redis.call('set', KEYS[1], ARGV[1]);redis.call('expire', KEYS[1], ARGV[2]); return 1" 1 luatest 6666 5000
SCRIPT LOAD命令 和 EVALSHA命令
script load 脚本加载到redis服务端,并返回计算好的sha值
evalsha sha numkeys key [key …] arg [arg …]
evlasha redis服务端加载好的脚本的sha值 剩下的参数和eval的参数一致
eval d8158814dd6a7f25dc12946a89aac70b998ce750 1 luatest 6666 5000
指令和
eval "redis.call('set', KEYS[1], ARGV[1]);redis.call('expire', KEYS[1], ARGV[2]); return 1" 1 luatest 6666 5000
结果是一致的
SCRIPT EXISTS
用于判断lua脚本是否已在服务端加载过
SCRIPT FLUSH
清空Redis服务端所有加载过的lua脚本
SCRIPT KILL
杀死Redis服务端正在执行中的lua脚本
todo java三种客户端连接笔记记录好后再,完善这部分