redis 中的lua脚本是如何执行的?
Loen
Redis 中 Lua 脚本的执行机制
1. Lua 脚本是如何执行的?
Redis 使用 EVAL 和 EVALSHA 命令执行 Lua 脚本:
| |
执行特点:
- 原子性:脚本作为一个整体执行,期间不会被其他命令打断
- 单线程:Redis 单线程执行,避免并发问题
- 事务性:优于 Redis 事务(MULTI/EXEC),没有事务失败问题
2. Lua 脚本以什么形式存在于 Redis 中?
脚本在 Redis 中以两种形式存在:
| |
存储特点:
- 脚本缓存是 volatile 的,重启后消失
- 使用 LRU 机制管理缓存,默认缓存 10000 个脚本
- 可通过
redis.config调整lua-time-limit(默认 5 秒超时)
3. Lua 脚本的运行环境来源
Redis 为每个 Lua 脚本创建独立的 Lua 环境:
| |
环境隔离机制:
- 每次 EVAL 创建新环境:脚本间不共享变量
- SCRIPT KILL 可终止:超时脚本(只读脚本除外)
- 沙箱环境:限制危险操作(如文件访问)
4. Lua 脚本的作用域判定
| |
作用域规则:
- KEYS 必须声明:集群模式下用于路由到正确节点
- ARGV 是普通参数:不参与键的路由
- 变量作用域:
- 局部变量:
local var(推荐) - 全局变量:避免使用(可能被 Redis 重置)
- 局部变量:
5. Lua 脚本能使用的 Redis 函数
核心函数:
| |
支持的 Redis 命令类型:
| |
Lua 与 Redis 数据类型转换:
| |
最佳实践示例:
| |
重要限制:
- 脚本默认 5 秒执行超时
- 脚本中不能执行阻塞命令(BLPOP, BRPOP 等)
- 集群环境下所有键必须在同一个节点(用哈希标签确保)
- 脚本返回结果大小有限制