*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 / DEBUGO(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 不会自动淘汰已加载的脚本。