官方文档地址:http://redis.cn/commands/eval.html
Redis中使用命令调用lua脚本是通过命令EVAL;
比如:
这里返回的是nil是应为redis没有检测到lua的返回值,这里稍作修改:
可以查看他的语法如下:
主要参数是:script numkeys,keys[],arg[]
numkeys:是规定我们之后传入参数的第几个参数是我们的一些key,剩余的都会传递到ARGV中,
eg:EVAL "return redis.call('SET',KEYS[1],ARGV[2])" 3 zl1 zl2 zl3 v1 v2 v3 v4 这里是zl1-4是传递给keys中,后面是传给argv;
这里获取到zl1对应的值是v2,这句意思即是:numkeys等于3,表明zl1--v4中,zl1,zl2,zl3是key的数据,v1,v2,v3,v4是value的数据,KEYS[1]获取到的是zl1,ARFV[2]获取到的是v2;
是用redis.pcall可以捕获lua中的异常
LUA中的数据类型和Redis中转换:
Lua 类型和 Redis 类型之间存在着一一对应的转换关系。
Redis 到 Lua 的转换表。
- Redis integer reply -> Lua number / Redis 整数转换成 Lua 数字
- Redis bulk reply -> Lua string / Redis bulk 回复转换成 Lua 字符串
- Redis multi bulk reply -> Lua table (may have other Redis data types nested) / Redis 多条 bulk 回复转换成 Lua 表,表内可能有其他别的 Redis 数据类型
- Redis status reply -> Lua table with a single ok field containing the status / Redis 状态回复转换成 Lua 表,表内的 ok 域包含了状态信息
- Redis error reply -> Lua table with a single err field containing the error / Redis 错误回复转换成 Lua 表,表内的 err 域包含了错误信息
- Redis Nil bulk reply and Nil multi bulk reply -> Lua false boolean type / Redis 的 Nil 回复和 Nil 多条回复转换成 Lua 的布尔值 false
Lua 到 Redis 的转换表。
- Lua number -> Redis integer reply (the number is converted into an integer) / Lua 数字转换成 Redis 整数
- Lua string -> Redis bulk reply / Lua 字符串转换成 Redis bulk 回复
- Lua table (array) -> Redis multi bulk reply (truncated to the first nil inside the Lua array if any) / Lua 表(数组)转换成 Redis 多条 bulk 回复
- Lua table with a single ok field -> Redis status reply / 一个带单个 ok 域的 Lua 表,转换成 Redis 状态回复
- Lua table with a single err field -> Redis error reply / 一个带单个 err 域的 Lua 表,转换成 Redis 错误回复
- Lua boolean false -> Redis Nil bulk reply. / Lua 的布尔值 false 转换成 Redis 的 Nil bulk 回复
从 Lua 转换到 Redis 有一条额外的规则,这条规则没有和它对应的从 Redis 转换到 Lua 的规则:
- Lua boolean true -> Redis integer reply with value of 1. / Lua 布尔值 true 转换成 Redis 整数回复中的 1
还有下面两点需要重点注意:
- lua中整数和浮点数之间没有什么区别。因此,我们始终Lua的数字转换成整数的回复,这样将舍去小数部分。如果你想从Lua返回一个浮点数,你应该将它作为一个字符串(见比如ZSCORE命令)。
- There is no simple way to have nils inside Lua arrays, this is a result of Lua table semantics, so when Redis converts a Lua array into Redis protocol the conversion is stopped if a nil is encountered.
Redis中使用Lua脚本的相关命令介绍
可以将lua脚本缓存到redis中,调用的是时候直接调用即可;
Redis中缓存脚本使用:SCRIPT LOAD “脚本”
eg:
这里的返回值是对应的字符串的一个加密值
缓存之后的脚本调用: EVALSHA cf63a54c34e159e75e5a3fe4794bb2ea636ee005
使用命令:SCRIPT FLUSH 删除redis中的所有的lua脚本;
SCRIPT KILL 杀死正在执行的lua脚本
SCRIPT EXISTS cf63a54c34e159e75e5a3fe4794bb2ea636ee005 -->返回1表示该脚本存在,否则不存在
由于redis是单线程执行的,所有在执行lua脚本的时候可以保证该操作的原子性;