redis执行lua脚本的两种方式:使用redis交互命令执行,直接执行lua脚本。两种方式的传参其实是不一样的。
一、使用redis交互命令执行
格式:eval lua-script key-num keys... values...
- lua-script : 脚本内容
- key-num :key的数量。没有key时,传0
- keys... :具体的key,数量需要key-num一致,可以为空,多个用空格隔开
- values... :具体的value,可以为空,多个用空格隔开
所有参数,不做区分,均以空格隔开。
示例:
// 一个key一个value
127.0.0.1:6379> eval "return KEYS[1]..ARGV[1]" 1 key1 value1
// 只有一个value
127.0.0.1:6379> eval "return ARGV[1]" 0 value1
// 多个key多个value
127.0.0.1:6379> eval "return KEYS[1]..KEYS[2]..ARGV[1]..ARGV[2]" 2 k1 k2 v1 v2
二、直接执行lua脚本
test_params_transfer.lua,该脚本仅有一行代码:
return KEYS[1]..ARGV[1]..ARGV[2]
格式: redis-cli --eval yourScript.lua keys... , values
- yourScript.lua :待执行的lua脚本
- keys... :具体的key值,多个用空格隔开。可以为空,为空时,需要使用''占位
- values... :具体的value值,多个用空格隔开。可以为空,为空时不需要占位
- 划重点:keys...与values...之间用逗号隔开,逗号两侧必须有空格
// 没有key,多个value
redis-cli --eval test_params_transfer.lua '' , v1 v2
// 多个key,多个value
redis-cli --eval test_params_transfer.lua k1 k2 , v1 v2
// 没有value
redis-cli --eval test_params_transfer.lua k1 k2
附:遇到的一个小坑:
脚本使用type识别redis的key的类型的时候,返回值是一个table,而不是一个单纯的类型,比如string,可以使用键值"OK"取出真正的键的类型