首页/数据/Redis 进阶速查/Lua 脚本与函数的内存
内存与管理99 条

Lua 脚本与函数的内存

Lua 脚本与 Redis Functions 占用独立内存统计(used_memory_lua / used_memory_functions),脚本缓存过多会体现在这两项。

Redis 进阶速查数据更新于 2026-10-13

Lua 脚本与函数的内存

Redis 把脚本与函数的内存单独统计:脚本缓存按 SHA1 保存脚本文本,函数库由 FUNCTION LOAD 加载并随数据持久化。这两部分在 INFO memory 里有独立字段,体积通常很小,但客户端若动态拼接脚本文本,缓存条目会只增不减,成为容易被忽略的内存来源。

基本信息

脚本字段used_memory_lua、used_memory_scripts、number_of_cached_scripts
函数字段used_memory_functions、number_of_functions(Redis 7.0 起)
来源EVAL/EVALSHA 缓存与 FUNCTION LOAD
生命周期脚本缓存重启即清空,函数库随 RDB/AOF 保留
清理命令SCRIPT FLUSH、FUNCTION FLUSH 与 FUNCTION DELETE
执行保护lua-time-limit 限制单次脚本执行时长

典型使用场景

  • 巡检脚本缓存:缓存条目数长期上涨,说明客户端没有复用同一份脚本体
  • 上线前评估:把脚本预加载成固定文本,客户端用 SHA1 调用更省缓存
  • 函数治理:FUNCTION LIST 确认加载了哪些库、各自占用多少内存
  • 排查 NOSCRIPT 报错:客户端收到该错误,通常是被清理过缓存或实例重启
  • 内存归因:脚本内存异常偏高时,先查是否把数据存进了脚本或函数状态

最小示例

最小示例
redis-cli INFO memory | grep -E 'used_memory_lua|used_memory_scripts|number_of_cached_scripts'
redis-cli SCRIPT EXISTS 5f6b1f9c0f1f    # 用 SHA1 判断脚本是否还在缓存里
redis-cli SCRIPT LOAD "$(cat script.lua)" # 预加载,之后用 EVALSHA 调用
redis-cli SCRIPT FLUSH                  # 清空脚本缓存,用 EVALSHA 的客户端会失败
redis-cli FUNCTION LIST                 # 查看已加载的函数库(Redis 7.0 起)
redis-cli CONFIG GET lua-time-limit      # 单次脚本的最长执行时间

字段读法

字段含义异常信号
used_memory_luaLua 引擎自身占用相对稳定,随脚本执行小幅波动
used_memory_scripts已缓存脚本文本占用持续增长说明脚本体在不断变化
number_of_cached_scripts缓存脚本条目数上万条说明客户端没有复用脚本体
used_memory_functions已加载函数库占用(7.0 起)随发布增长,需要有下线机制
number_of_functions已加载函数条目数与预期的库数量不符,要复盘发布流程
脚本缓存与函数库是两套机制:脚本缓存重启即失效,用 EVALSHA 的客户端必须保留 EVAL 回退路径;函数库属于部署资产,应纳入版本管理与上线流程。
脚本体内创建的大对象只占用执行期内存,不计入脚本缓存字段,它体现在 used_memory 与峰值上。写脚本时避免一次性构造超大表或做全量遍历。

易错点

  • 客户端只用 EVALSHA 而没有 EVAL 回退:遇到 SCRIPT FLUSH 或重启会持续报 NOSCRIPT
  • 动态拼接脚本文本直接 EVAL:每次文本不同就多一份缓存,条目数与内存同时上涨
  • 把 Redis 当脚本仓库:函数库长期只加载不清理,加载量与维护成本都会上升
  • 脚本里构造超大对象或全量扫描:执行期间内存与 CPU 双高,还可能超时被强制终止
  • 不区分版本读字段:函数相关字段 7.0 起才有,低版本采集会拿到空值并误判为 0

数据来源与参考

  • Redis 官方文档:脚本内存统计
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌