最近,业务代码上大量使用redis,每一次操作会对多个key进行操作,而有些key可能在别的操作中也会同一时刻被改动,所以为了保证中途不被别的修改,采用了lua脚本的方式
为什么不用redis事务
众所周知,redis自己也有一套事务机制,但redis的原子性实现是类似乐观锁的机制,如果在事务中的命令修改的key被其他事务或命令修改,则会执行失败回滚。 再加上redis本身事务并未很好的实现ACID,也导致redis的事务使用的场景一直不是很多。以后会有专门的文章书写redis的事务
与pipeline的区别
一般管道的使用场景是多个命令无依赖,或者批量操作一批key。使用pipeline就可以节省指令来回需要的rrt
redis lua脚本使用方式
lua脚本是能保证隔离性的,即在执行脚本的过程中,是没有其他指令可以执行的,而且还可以进行逻辑的判断,因此大多数情况下,我们会用lua脚本的方式替代事务。
参考文档
https://redis.io/topics/transactions
https://redis.io/topics/pipelining
https://redis.io/commands/eval