有没有理由在Redis中使用multi/watch/exec而不是Lua脚本(eval)



我是Redis的新手,我是这样看待它的:

在我看来,watch/multy/exec是实现乐观事务的一种相当尴尬的方式。watch和exec之间的持续时间可能很长,通常需要经过几次往返才能完成(客户端需要向Redis服务器发送多个命令(。

另一方面,Lua脚本支持更强大的事务(回滚、复杂的条件检查…(,并且不需要多次往返(全部在一个命令中(。而且它更直接。

我知道Lua脚本与watch/multy/exec相比是相对较新的。那么现在有理由使用watch/multi/exec吗?

如果您可以在一个简短的Lua脚本中完成所有操作,这可能是最有效的方法。但是,如果您的事务可能很长或需要访问外部资源才能完成,则应避免使用Lua,尤其是因为执行Lua脚本会阻止Redis服务器进行并行调用。

任何事情都有利弊。

为什么使用MULT/EXEC(主要原因(:

  • 简单动词(如果你已经对Redis感兴趣(,不需要"学习";Lua(尽管只需要15分钟(
  • 在服务器处理中,不需要启动Lua上下文(尽管这样做的代价很小(
  • 确保块原子性

一旦你需要读取交易中的数据(即使用WATCH(,为了方便起见,我会立即使用Lua。当然,长时间运行的事务或Lua脚本会阻塞服务器,所以尽量避免这些情况。虽然在MULTI/EXEC的上下文中更难做到这一点,但Lua中的无限循环可以用一行完成:(