第20章 Lua脚本

Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务器端原子地执行多个Redis命令。

其中,使用EVAL命令可以直接对输入的脚本进行求值:



redis> EVAL "return 'hello world'" 0
"hello world"

而使用EVALSHA命令则可以根据脚本的SHA1校验和来对脚本进行求值,但这个命令要求校验和对应的脚本必须至少被EVAL命令执行过一次:



redis> EVAL "return 1+1" 0
(integer) 2
redis> EVALSHA "a27e7e8a43702b7046d4f6a7ccf5b60cef6b9bd9" 0 // 
上一个脚本的校验和
integer) 2 

或者这个校验和对应的脚本曾经被SCRIPT LOAD命令载入过:



redis> SCRIPT LOAD "return 2*2"
"4475bfb5919b5ad16424cb50f74d4724ae833e72"
redis> EVALSHA "4475bfb5919b5ad16424cb50f74d4724ae833e72" 0
(integer) 4

本章将对Redis服务器中与Lua脚本有关的各个部分进行介绍。

首先,本章将介绍Redis服务器初始化Lua环境的整个过程,说明Redis对Lua环境进行了哪些修改,而这些修改又对用户执行Lua脚本产生了什么影响和限制。

接着,本章将介绍与Lua环境进行协作的两个组件,它们分别是负责执行Lua脚本中包含的Redis命令的伪客户端,以及负责保存传入服务器的Lua脚本的脚本字典。了解伪客户端可以知道脚本中的Redis命令在执行时,服务器与Lua环境的交互过程,而了解脚本字典则有助于理解SCRIPT EXISTS命令和脚本复制功能的实现原理。

在这之后,本章将介绍EVAL命令和EVALSHA命令的实现原理,说明Lua脚本在Redis服务器中是如何被执行的,并对管理脚本的四个命令——SCRIPT FLUSH命令、SCRIPT EXISTS命令、SCRIPT LOAD命令、SCRIPT KILL命令的实现原理进行介绍。

最后,本章将以介绍Redis在主从服务器之间复制Lua脚本的方法作为本章的结束。