返回信息流恢复到执行的语句处,后面的语句不能进行,前面的也不能撤回
这是一条镜像帖。来源:北邮人论坛 / iwhisper / #8226884同步于 2025/4/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
IWhisper机器人发帖
Java后端面试:执行 Lua 脚本时,Redis 挂了怎么办?
IWhisper#199
2025/4/15镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
11 条回复
<br>【 在 IWhisper#128 的大作中提到: 】<br><font class="f006">: 恢复到执行的语句处,后面的语句不能进行,前面的也不能撤回 </font><br>如果lua脚本对应的Redis命令已经成功写入并刷盘到 AOF 文件中,那么就能恢复吧;并且这个操作是不是原子的,要么Lua脚本的所有命令刷进,要么一条命令都刷不进
这个不好搞吧,lua不支持回滚<img src="/img/ubb/emb/2.gif" alt="emb2" style="display:inline;border-style:none">
<br>【 在 IWhisper#425 的大作中提到: 】<br><font class="f006">: 这个不好搞吧,lua不支持回滚 </font><br>AI是这么说的:<br>宕机发生时:<br> 情况一:如果 EVAL/EVALSHA 命令还没来得及根据 appendfsync 策略(如 everysec)刷入到磁盘上的 AOF 文件中,那么这条命令就丢失了。Redis 重启后,AOF 文件中没有这条记录,效果等同于Lua脚本从未执行。<br> 情况二:如果 EVAL/EVALSHA 命令已经成功写入并刷盘到 AOF 文件中,那么这条命令就被持久化了。当 Redis 重启时,它会通过重放 AOF 文件中的命令来恢复数据状态。当重放到这条 EVAL/EVALSHA 命令时,Redis 会将这个 Lua 脚本从头到尾、完整地重新执行一次。因为脚本逻辑本身是设计用来完成特定原子操作的,这次重放执行会达到预期的最终数据状态。<br>那感觉Redis宕机也不会影响lua脚本啊<br><br>
回滚对应的是事务性吧<img src="/img/ubb/em/14.gif" alt="em14" style="display:inline;border-style:none"><br>【 在 IWhisper#217 的大作中提到: 】<br><font class="f006">: lua 不支持回滚那怎么能实现操作的原子性呢? </font>
undo log是保证mysql原子性的,lua的原子性和数据库的acid不太一样,lua脚本的原子性应该就是保证它执行期间不会被中断,通过单线程执行来保证<br>【 在 IWhisper#217 的大作中提到: 】<br><font class="f006">: lua 不支持回滚那怎么能实现操作的原子性呢? </font><br>:
单线程+lua脚本被redis重新编译成一条命令执行<br>【 在 IWhisper#115 的大作中提到: 】<br><font class="f006">: undo log是保证mysql原子性的,lua的原子性和数据库的acid不太一样,lua脚本的原子性应该就是保证它执行期间不会被中断,通过单线程执行来保证 </font>
那假如 lua 脚本执行一般宕机了怎么办<br>【 在 IWhisper#199 的大作中提到: 】<br><font class="f006">: </font><br><font class="f006">: AI是这么说的: </font><br><font class="f006">: 宕机发生时: </font><br><font class="f006">: ............ </font>