*Redis SCRIPT 命令
SCRIPT 是 Redis Lua 脚本管理的入口命令,提供加载、检查、清空、终止和调试脚本等功能。
*语法
SCRIPT LOAD script
SCRIPT EXISTS sha1 [sha1 ...]
SCRIPT FLUSH [ASYNC | SYNC]
SCRIPT KILL
SCRIPT DEBUG (YES | NO | SYNC)
SCRIPT HELP
*参数说明
| 子命令 | 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| LOAD | script | String | 是 | Lua 脚本源码 |
| EXISTS | sha1 | String | 是 | 脚本的 SHA1 摘要,支持多个 |
| FLUSH | ASYNC / SYNC | Flag | 否 | 异步或同步清空缓存,默认 SYNC |
| KILL | 无 | — | — | 终止当前执行的脚本 |
| DEBUG | YES / NO / SYNC | Flag | 是 | 调试模式开关 |
| HELP | 无 | — | — | 返回帮助信息 |
*返回值
- LOAD:返回 SHA1 字符串
- EXISTS:返回 0/1 整数数组(1 表示存在)
- FLUSH:OK
- KILL:OK 或错误(脚本已写数据时无法终止)
- DEBUG:OK
- HELP:帮助文本数组
*时间复杂度
- LOAD:O(N),N 为脚本长度
- EXISTS:O(N),N 为 SHA1 数量
- FLUSH / KILL / DEBUG:O(1) ---
*示例
*加载脚本
> SCRIPT LOAD "return redis.call('GET', KEYS[1])"
"6b1bf486c81c7fb1b5c5c7a9e8d5f5c5c5c5c5c5"
*检查脚本是否存在
> SCRIPT EXISTS "6b1bf486c81c7fb1b5c5c7a9e8d5f5c5c5c5c5c5" "badsha1"
1) (integer) 1
2) (integer) 0
*清空脚本缓存
> SCRIPT FLUSH
OK
> SCRIPT FLUSH ASYNC
OK
*终止脚本
> SCRIPT KILL
OK
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 缺少必要参数 | 检查子命令语法 |
| ERR Unknown SCRIPT subcommand | 子命令拼写错误 | 使用 LOAD/EXISTS/FLUSH/KILL/DEBUG/HELP |
| ERR Sorry the script already wrote to the DB | KILL 时脚本已执行写操作 | 只能 SHUTDOWN NOSAVE 终止 |
*最佳实践
- 预加载脚本:应用启动时 SCRIPT LOAD 所有常用脚本,运行时用 EVALSHA 提升性能
- 定期清理:开发测试环境频繁变更脚本时,SCRIPT FLUSH 清理旧缓存
- SCRIPT KILL 慎用:只终止无写操作的脚本;有写操作的脚本只能用 SHUTDOWN NOSAVE
- 生产环境避免频繁 SCRIPT FLUSH,会导致所有 EVALSHA 回退到 EVAL
*FAQ
Q1: SCRIPT FLUSH 会清除所有脚本吗? A: 是。清空当前实例的 Lua 脚本缓存,所有 EVALSHA 将返回 NOSCRIPT 错误。
Q2: 脚本缓存有大小限制吗? A: 没有硬性限制,但缓存的脚本占用内存,不用的脚本应定期清理。
Q3: SCRIPT LOAD 后脚本会永久保留吗? A: 是的,直到执行 SCRIPT FLUSH 或实例重启。Redis 不会自动淘汰已加载的脚本。