在Redis中执行Lua脚本有两种方法:eval和evalsha。html
eval 脚本内容 key个数 key列表 参数列表
下面例子使用了key列表和参数列表来为Lua脚本提供更多的灵活性:java
127.0.0.1:6379> eval 'return "hello " .. KEYS[1] .. ARGV[1]' 1 redis world "hello redisworld"
此时KEYS[1]="redis",ARGV[1]="world",因此最终的返回结果是"hello redisworld"。redis
若是Lua脚本较长,还可使用redis-cli--eval直接执行文件。shell
$ redis-cli --eval hello.lua mykey , myargv
注意,这种方式不须要指定key的数量,用 , 号划分key和arg,注意逗号左右的空格。api
eval命令和--eval参数本质是同样的,客户端若是想执行Lua脚本,首先在客户端编写好Lua脚本代码,而后把脚本做为字符串发送给服务端,服务端会将执行结果返回给客户端。函数
除了使用eval,Redis还提供了evalsha命令来执行Lua脚本。lua
首先要将Lua脚本加载到Redis服务端,获得该脚本的SHA1校验和,evalsha命令使用SHA1做为参数能够直接执行对应Lua脚本,避免每次发送Lua脚本的开销。这样客户端就不须要每次执行脚本内容,而脚本也会常驻在服务端,脚本功能获得了复用。3d
script load命令能够将脚本内容加载到Redis内存中,例以下面将lua_get.lua加载到Redis中,获得SHA1为:"7413dc2440db1fea7c0a0bde841fa68eefaf149c"调试
$ redis-cli script load "$(cat lua_get.lua)" "7413dc2440db1fea7c0a0bde841fa68eefaf149c"
evalsha的使用方法以下,参数使用SHA1值,执行逻辑和eval一致。日志
evalsha 脚本SHA1值 key个数 key列表 参数列表
因此只须要执行以下操做,就能够调用lua_get.lua脚本:
127.0.0.1:6379> evalsha 7413dc2440db1fea7c0a0bde841fa68eefaf149c 1 redis world "hello redisworld"
Lua可使用redis.call函数实现对Redis的访问,例以下面代码是Lua使用redis.call调用了Redis的set和get操做:
redis.call("set", "hello", "world") redis.call("get", "hello")
放在Redis的执行效果以下:
127.0.0.1:6379> eval 'return redis.call("get", KEYS[1])' 1 hello "world"
除此以外Lua还可使用redis.pcall函数实现对Redis的调用,redis.call和redis.pcall的不一样在于,若是redis.call执行失败,那么脚本执行结束会直接返回错误,而redis.pcall会忽略错误继续执行脚本,因此在实际开发中要根据具体的应用场景进行函数的选择。
获取KEY能够经过 KEYS[1],获取 Value 能够经过 ARGV[1] 。
Lua可使用redis.log函数将Lua脚本的日志输出到Redis的日志文件中,可是必定要控制日志级别。
Redis3.2提供了Lua Script Debugger功能用来调试复杂的Lua脚本,具体能够参考:http://redis.io/topics/ldb。
redis.log(redis.LOG_DEBUG,key1)
redis.LOG_DEBUG
redis.LOG_VERBOSE
redis.LOG_NOTICE
redis.LOG_WARNING
本文并无详细讲解如何读取复杂参数以及结合程序开发,详细能够参考个人另外一篇文章: