redis运行lua脚本的介绍
在redis中使用lua
eval
eval 脚本内容 key个数 key列表 参数列表
结果如下:
redis-cli --eval
如果lua脚本较长,可以使用redis-cli --eval的方式:
新建lua.lua文件,在文件中输入:return KEYS[1]..ARGV[1]
在linux中执行:
redis-cli --eval 文件路径 keys , argvs
key和参数间需要使用逗号(,)隔开,并且需要占用空格
eval命令和- -eval参数的方式本质上是一样的,客户端将需要执行的lua脚本作为字符串发送给服务端,服务端将执行结果返回给客户端。
evalsha
使用evalsha执行lua脚本,首先需要将lua脚本加载到服务端(会常驻内存中),服务端会返回该脚本的SHA1值,evalsha命令使用SHA1作为参数直接可以执行对应脚本,避免每次发送Lua脚本的开销。
加载脚本
在linux中执行:redis-cli script load "$(cat 文件路径)"
执行脚本
在redis客户端执行:evalsha sha1值 key数量 key列表 参数列表
redis管理脚本
- script load
此命令用于将Lua脚本加载到Redis内存中 - scripts exists sha1 [sha1 …]
此命令用于判断sha1是否已经加载到Redis内存中,返回结果代表sha1[sha1…]被加载到Redis内存的个数 - script flush
此命令用于清除Redis内存已经加载的所有Lua脚本 - script kill
此命令用于杀掉正在执行的Lua脚本。 如果Lua脚本比较耗时, 甚至Lua脚本存在问题, 那么此时Lua脚本的执行会阻塞Redis, 直到脚本执行完毕或者外部进行干预将其结束。
如果当前Lua脚本正在执行写操作, 那么script kill将不会生效。
Lua的Redis API
Lua可以使用redis.call函数实现对Redis的访问:
--set("db","redis")
redis.call("set", "db", "redis")
--get("db")
redis.call("get", "db")
除此之外Lua还可以使用redis.pcall函数实现对Redis的调用, redis.call和redis.pcall的不同在于, 如果redis.call执行失败, 那么脚本执行结束会直接返回错误, 而redis.pcall会忽略错误继续执行脚本, 所以在实际开发中要根据具体的应用场景进行函数的选择。
参考:
Redis开发与运维