Redis(六)Script

Redis从2.6.0开始,可以使用命令EVALEVALSHA执行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)