Lua脚本编程

4 篇文章 0 订阅
4 篇文章 0 订阅

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)的信息被写入数据库中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值