在整理Lua脚本之前,我以为Lua脚本会非正常有用,但是当我翻尚硅谷的笔记时却发现Redis集群下着实不可用这个Lua脚本。于是我这里简单的做一个小小整理。不以重点学习
Redis中的LUA脚本语法
LUA脚本语法可以去菜鸟教程。这里点出官方文档强调的几点
- Lua脚本中不应该定义函数
- Lua脚本不允许全局变量
- 入参【key ..】可以通过KEYS[1]、KEYS[2]…方式取,以1位基准,
- 入参[arg….]可以通过ARGV用来取value的个数,基数也是1。
- 脚本中调用Redis命令可以通过 redis.call()和redis.pcall
-
写几个LUA脚本
1.通过LUA脚本设置两对key-value
eval "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2]) return 1" 2 name age gx 1
2.取key=age的值,并把age的值+1,设置给weakAge
eval "local nowAge = redis.call('get',KEYS[1]) redis.call('set',KEYS[2],nowAge+1) return 1" 2 age weakAge
call和pcall的区别
eval "redis.call('set','call',1) redis.call('get2','name') redis.call('set','call',2)" 0
eval "redis.pcall('set','pcall',1) redis.pcall('get2','name') redis.pcall('set','pcall',2)" 0
call:会清除的报给你哪行错误,且前面成功的就成功了,后面不会执行
- pcall:错了也会继续走,且不一定会告诉你是哪行有问题
脚本缓存
每次都用eval 然后一大串字符串脚本,总是会有点烦的。所以Redis每次都会把运行过的脚本缓存。下次运行只需要指定其SHA1校验和,redis就能知道是哪个脚本了
获取校验和
eval 'return redis.sha1hex(ARGV[1])' 0 "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2]) return 1"
127.0.0.1:6379> eval ‘return redis.sha1hex(ARGV[1])’ 0 “redis.call(‘set’,KEYS[1],ARGV[1]) redis.call(‘set’,KEYS[2],ARGV[2]) return 1” “fb55d4a79a90a0cae651b150227128be584651f0”
用校验和执行
evalsha fb55d4a79a90a0cae651b150227128be584651f0 2 key1 key2 1 2
关闭Redis后再执行
-
清空所有脚本缓存
script flush
总结
这篇文章是通过粗略浏览官方文档和Lua脚本语言而写的一些关于Redis中Lua脚本的用法。皮毛而已,但是下次遇到Lua脚本时,总不会有这是什么玩意的想法。
个人感觉Lua脚本用处不大。参考资料
- https://www.runoob.com/lua/lua-tutorial.html