lua脚本编程笔记
基于工作需要,数据处理用到Redis,Lua的性能跟高效内嵌到Redis服务器上,对数据处理会有很大的帮助
一、编写脚本
1.编写脚本(在Redis中获取status_table哈希集合中指定key的值)
新建脚本 redis_get_status.lua
-- 获取Redis存储数据
local key=KEYS[1]
local result=redis.call("hget","status_table", key);
return result;
二、调用
1.eval 执行脚本
EVAL sha1 numkeys key [key …] arg [arg …]
> redis-cli eval "$(cat redis_get_boxstatus.lua)" 1 04Bxxxxx
> :0
键名参数 key [key …] 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
在命令的最后,那些不是键名参数的附加参数 arg [arg …] ,可以在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。
> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
2.SCRIPT LOAD 加载脚本
SCRIPT LOAD “script_lua”
> redis-cli SCRIPT LOAD "$(cat ./redis_get_boxstatus.lua)"
> :"bc008d53483694bd1e4bdb61a9a183d54caaf7b8"
SCRIPT LOAD加载脚本会生成SHA1摘要字符串,在redis上加载的脚本是永久缓存,这样之后可以通过EVALSHA命令用SHA1执行脚本。
3.evalsha 执行脚本
EVALSHA sha1 numkeys key [key …] arg [arg …]
> redis-cli evalsha bc008d53483694bd1e4bdb61a9a183d54caaf7b8 1 04Bxxxxx
> :0
注:每次调用SCRIPT LOAD比较烦琐(可在部署时加载)。其实,当一个程序执行EVAL时就已经隐式加载了,程序会先试着EVALSHA,当脚本没有找到时会调用EVAL
4.eval 执行脚本文件
redis-cli --eval
> redis-cli --eval ./luascriptname.lua key1 key2, first second
注:参数 --eval script key1 key2 , arg1 age2 这种模式,key和value用一个逗号隔开
三、Redis 脚本操作
1.查看是否有该SHA1对应有脚本缓存
SCRIPT EXISTS
> redis-cli SCRIPT EXISTS bc008d53483694bd1e4bdb61a9a183d54caaf7b8
> :1) (integer) 1
2.清空Lua脚本缓存
SCRIPT FLUSH
> redis-cli SCRIPT FLUSH
> :OK
3.杀死当前正在运行的 Lua 脚本
SCRIPT KILL
> redis-cli SCRIPT KILL
当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。这个命令主要用于终止运行时间过长的脚本,比如一个因为 BUG 而发生无限 loop 的脚本,诸如此类。
SCRIPT KILL 执行之后,当前正在运行的脚本会被杀死,执行这个脚本的客户端会从 EVAL 命令的阻塞当中退出,并收到一个错误作为返回值。
另一方面,假如当前正在运行的脚本已经执行过写操作,那么即使执行 SCRIPT KILL ,也无法将它杀死,因为这是违反 Lua 脚本的原子性执行原则的。在这种情况下,唯一可行的办法是使用 SHUTDOWN NOSAVE 命令,通过停止整个 Redis 进程来停止脚本的运行,并防止不完整(half-written)的信息被写入数据库中。