# 3.3 lua脚本相关命令

## 3.3.1 把lua脚本装载到缓存里

* `SCRIPT LOAD`
  * 语法:`SCRIPT LOAD script`
  * 将脚本script添加到脚本缓存中,但并不立即执行这个脚本.该命令返回给定脚本的SHA1校验和

例:

装载脚本:

```
127.0.0.1:6379> SCRIPT LOAD 'return 1 + 2'
"e412f6a7f0b07176d9824bb91205d9d54e88fdc0"
```

* `SCRIPT EXISTS`
  * 语法:`SCRIPT EXISTS script [script ...]`
  * 功能:校验指定的脚本是否已经被保存在缓存当中.返回值为一个列表,1表示脚本存在,0表示脚本不存在.列表中的元素和给定的SHA1校验和保持对应关系

例:

装载脚本:

```
127.0.0.1:6379> SCRIPT LOAD 'return 3 + 4'
"838b9ce712555508c95330c46ab526d2b01f4d5f"
```

根据校验和确认脚本是否存在:

```
127.0.0.1:6379> SCRIPT EXISTS e412f6a7f0b07176d9824bb91205d9d54e88fdc0 838b9ce712555508c95330c46ab526d2b01f4d5f abc123
1) (integer) 1
2) (integer) 1
3) (integer) 0
```

可以看到,由于不存在校验和为`abc123`的脚本,因此对于该校验和的返回值为0

## 3.3.2 通过`EVALSHA`命令执行缓存中的脚本

* `EVALSHA`
  * 语法:`EVALSHA sha1 numkeys key [key ...] arg [arg ...]`.其中:
    * sha1:脚本的sha1校验和
    * numkeys:参数个数
    * key:表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量`KEYS`数组,用1为基址的形式访问(`KEYS[1]`,`KEYS[2]`,以此类推)
    * arg:附加参数,在Lua中通过全局变量`ARGV`数组访问,访问的形式和KEYS变量类似(`ARGV[1]`,`ARGV[2]`,诸如此类)
  * 功能:根据给定的sha1校验码,执行缓存在服务器中的脚本

例:执行上文加载的`return 1 + 2`

```
127.0.0.1:6379> EVALSHA e412f6a7f0b07176d9824bb91205d9d54e88fdc0 0
(integer) 3
```

## 3.3.3 清空缓存中lua脚本的命令

* `SCRIPT FLUSH`
  * 语法:`SCRIPT FLUSH`
  * 功能:清除所有Lua脚本缓存.该命令总是返回OK

确认脚本是否存在:

```
127.0.0.1:6379> SCRIPT EXISTS e412f6a7f0b07176d9824bb91205d9d54e88fdc0
1) (integer) 1
127.0.0.1:6379> SCRIPT EXISTS 838b9ce712555508c95330c46ab526d2b01f4d5f
1) (integer) 1
```

清空所有脚本:

```
127.0.0.1:6379> SCRIPT FLUSH
OK
```

确认脚本是否存在:

```
127.0.0.1:6379> SCRIPT EXISTS e412f6a7f0b07176d9824bb91205d9d54e88fdc0
1) (integer) 0
127.0.0.1:6379> SCRIPT EXISTS 838b9ce712555508c95330c46ab526d2b01f4d5f
1) (integer) 0
```

可以看到,脚本已经被清空了

## 3.3.4 用`EVAL`命令执行LUA脚本

* `EVAL`
  * 语法:`EVAL script numkeys key [key ...] arg [arg ...]`.其中:
    * numkeys:参数个数
    * key:表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量`KEYS`数组,用1为基址的形式访问(`KEYS[1]`,`KEYS[2]`,以此类推)
    * arg:附加参数,在Lua中通过全局变量`ARGV`数组访问,访问的形式和KEYS变量类似(`ARGV[1]`,`ARGV[2]`,诸如此类)
  * 功能:直接运行脚本

例:

运行一段LUA脚本,该脚本接收1个Redis键名和1个参数.

```
127.0.0.1:6379> EVAL "return { KEYS[1], ARGV[1] }" 1 name 'Peter'
1) "name"
2) "Peter"
```

* `SCRIPT KILL`
  * 语法:`SCRIPT KILL`
  * 功能:杀死当前正在运行的LUA脚本.当且仅当这个脚本没有执行过任何写操作时,这个命令才生效,该命令执行后,当前正在运行的脚本会被杀死,执行这个脚本的客户端会从`EVAL`命令的阻塞当中退出,并收到一个错误作为返回值.

例:在没有LUA脚本正在运行时执行`SCRIPT KILL`

```
127.0.0.1:6379> SCRIPT KILL
(error) NOTBUSY No scripts in execution right now.
```
