大纲
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] 获取值。