0%

事务

如何实现redis 原子性?

redis 执行一条命令的时候是具备原子性的,因为 redis 执行命令的时候是单线程来处理的,不存在多线程安全的问题。

如果要保证 2 条命令的原子性的话,可以考虑用 lua 脚本,将多个操作写到一个 Lua 脚本中,Redis 会把整个 Lua 脚本作为一个整体执行,在执行的过程中不会被其他命令打断,从而保证了 Lua 脚本中操作的原子性。

比如说,在用 redis 实现分布式锁的场景下,解锁期间涉及 2 个操作,分别是先判断锁是不是自己的,是自己的才能删除锁,为了保证这 2 个操作的原子性,会通过 lua 脚本来保证原子性

除了lua有没有什么也能保证redis的原子性?

redis 事务也可以保证多个操作的原子性。

如果 redis 事务正常执行,没有发生任何错误,那么使用 MULTI 和 EXEC 配合使用,就可以保证多个操作都完成。

但是,如果事务执行发生错误了,就没办法保证原子性了。比如说 2 个操作,第一个操作执行成果了,

但是第二个操作执行的时候,命令出错了,那事务并不会回滚,因为Redis 中并没有提供回滚机制。

因此,Redis 对事务原子性属性的保证情况:

  • Redis 事务正常执行,可以保证原子性
  • Redis 事务执行中某一个操作执行失败,不保证原子性