Redis进阶之使用Lua脚本自定义Redis命令

1.在Redis中使用Lua

在Redis中执行Lua脚本有两种方法:eval和evalsha。html

1.1 eval

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脚本代码,而后把脚本做为字符串发送给服务端,服务端会将执行结果返回给客户端。函数

1.2 evalsha

除了使用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"

2.Lua的RedisAPI

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] 。

3.开发提示

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

本文并无详细讲解如何读取复杂参数以及结合程序开发,详细能够参考个人另外一篇文章:

SpringBoot经过RedisTemplate执行Lua脚本

相关文章
相关标签/搜索