概述
Redis从2.6.0开始,可以使用命令EVAL
,EVALSHA
执行Lua脚本。
脚本命令
EVAL script numkeys key [key ...] arg [arg ...]
比如
EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2], ARGV[3]}" 2 key1 key2 a1 a2 a3
- 双引号"…"的内容就是Lua脚本,
- 2就是key的数量,指后面key1, key2,剩下a1, a2, a3就可以用ARGV[n]来表示
注意
Lua中索引从1开始,所以第1个是KEYS[1]或ARGV[1],KEYS和ARGV是Lua的全局变量在脚本中可以直接使用
上面的命令会返回
1) "key1"
2) "key2"
3) "a1"
4) "a2"
5) "a3"
如果EVAL中的脚本要执行Redis命令,可以使用
- redis.call()
- redis.pcall()
比如需要在脚本中执行Redis命令
>EVAL "return redis.call('set', 'foo', 'value1')" 0
OK
在Redis中脚本使用的规则,如果脚本中如果执行Redis命令,像上面设置key foo值为value value1,则是建议把key放在EVAL命令的key中传进去,像这样
>EVAL "return redis.call('set', KEYS[1], 'value1')" 1 foo
OK
这样的好处是,Redis可以根据foo判断key是在集群中不同的节点去执行。
原子性
Redis对EVAL执行脚本是保证原子性的,这跟MULTI
/ EXEC
是相似的,这就意味着脚本没执行完之前,其他客户端的命令或者脚本都是不能执行的,不过,脚本也不是没缺点的,如果脚本里产生死循环或其他情况,那将是致命的。
最后
以上就是怕黑哈密瓜为你收集整理的Redis(六)Script原子性的全部内容,希望文章能够帮你解决Redis(六)Script原子性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复