Lua 简介
从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL
命令对 Lua 脚本进行求值。Redis 使用单个 Lua 解释器去运行所有脚本,并且 Redis 也保证脚本会以原子性 (atomic) 的方式执行。当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。这和使用 MULTI / EXEC
包围的事务很类似。在其他别的客户端看来,脚本的效果 (effect) 要么是不可见的 (not visible),要么就是已完成的 (already completed)。在 Lua 脚本中,可以使用 redis.call ()
函数来执行 Redis 命令。
Lua 在 Reids 中的使用方式
Redis 中内嵌了 Lua 脚本的解释器,并提供了执行 Lua 脚本的入口 eval
命令,格式为 eval script numkeys key [key ...] arg [arg...]
。其中 eval
为命令,script
为执行的命令脚本,numkeys
为脚本中共涉及到的 key
的数量,后续接收若干个 key
的输入和若干个 arg
的输入。在 Lua 脚本中使用 KEYS[index]
, 和 ARGV[index]
来获取实际输入的参数,这有点类似于 SQL 的占位符。另外一层原因由于 Redis 集群的固有模式导致 EVAL
命令在集群中涉及多个 KEY 的操作时,要求所有的 KEY 都在同一个 Hash Solt 上。在集群环境中调用 EVAL
命令,Redis 会对脚本先做一个的校验。KEYS[1] KEYS[2]
是要操作的键,可以指定多个,在 Lua 脚本中可以通过 KEYS[1]
、KEYS[2]
获取 Key 的值。特别注意,这些键要在 Redis 中存在,不然就获取不到对应的值。ARGV[1] ARGV[2]
参数在 Lua 脚本中可以通过 ARGV[1]
、ARGV[2]
获取值。