# 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.
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://redis.sai.show/di-3-zhang-shi-jian-redis-de-chang-yong-ming-ling/3.3-lua-jiao-ben-xiang-guan-ming-ling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
