Redis提供了Lua脚本功能来让用户实现自己的原子命令,但也存在着风险,编写不当的脚本可能阻塞线程导致整个Redis服务不可用。
本文将介绍Redis中Lua脚本的基本用法,以及脚本超时导致的问题和处理方式。
EVAL命令简介
eval格式
Redis 提供了命令EVAL
来执行Lua脚本,格式如下
EVAL script numkeys key [key …] arg [arg …]
其中 script
是将要执行的脚本内容,至于后面的脚本参数部分与本文无关,在此不做赘述。
特性
由于Redis对数据集单线程读写的特性,Lua脚本执行时会阻塞所有对数据集的读写操作,这给它带来了下面两个特性:
-
原子性:可以通过Lua脚本实现对数据集的原子读写操作,这和Redis的事务功能
MULTI / EXEC
类似 -
长时间阻塞风险:如果Lua脚本执行时间过长,导致整个Redis不可用
执行流程
已 eval "return 'hello world'" 0
为例,脚本执行步骤如下
- 定义脚本函数
- 执行过的脚本可以根据hash值找到函数重新使用
Redis会根据传入的脚本内容生成函数,函数名由 f_
+ 脚本内容的sha1摘要组成。