在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
目录 1 1. 前言 1 2. 执行方式 1 3. 执行过程 3 4. 使用原则 3
1. 前言Redis的实现保证eval的执行是原子的,即使eval执行的lua超时,Redis也不会自动终止执行。 官方说明如下:
2. 执行方式截止到5.0.5版本,Redis都是将lua解释为一MULTI+EXEC方式执行。当执行以下Redis语句时:
观察它的AOF文件,可以发现内幕:
如果lua脚本有语法错误,可能导致部分执行,如执行下述脚本:
将得到错误:
原因是前一段脚本已将k2的值设置为ab,因此为非整数值,不能对该Key做incrby操作。这个时候AOF将只记录已成功执行部分:
所以在使用lua之前,一定要先测试好,排除掉语法错误。不然因Redis不支持回滚,会出现中间状态。如果确实需要回滚,也应当在同一段lua中完成提交或回滚。 Redis缓存每一段执行的lua脚本,并且不会主动释放,除非外部调用Redis命令“SCRIPT FLUSH”。Redis对执行的lua脚本做SHA,并用SHA值唯一标识该段lua脚本,后续可直接调用evalsha来执行该脚本,从而避免每次调用传入大段lua脚本。 另外,也可以执行Redis命令“SCRIPT KILL”来主动终止正在执行的lua脚本。但能终止的lua脚本仅限还未执行过写(write)操作,如果被KILL的lua脚本已执行了任意写操作,则“SCRIPT KILL”不能终止它的执行,这样约束的原因是为保证eval命令的原子性,不出现中间结果。 如果仍然要终止已执行写操作的lua脚本,只能通过执行“SHUTDOWN NOSAVE”方式,以阻止中间结果(half-written)的存在。 对于复杂的lua脚本 ,可执行redis-cli并指定参数“--ldb”,即可简单快捷的调试lua脚本。 3. 执行过程Lua的执行过程如下:
4. 使用原则使用eval+lua最好遵守以下原则: 1) 执行时间尽可能短,一定要小于连接的超时时长,可使用命令“slowlog get”观察实际情况; 2) 在应用到生产环境之前,测试保证没有语法错误; 3) 不要硬编码Key和Value到脚本中,不然缓存lua脚本的内存越积越多。
|
请发表评论