Skip to content

Latest commit

 

History

History
42 lines (35 loc) · 2.09 KB

RedisAtomic.md

File metadata and controls

42 lines (35 loc) · 2.09 KB

Redis的原子性

Redis中的事务本质上就是一组命令的集合, 开启事务后,要执行的命令在发送到server端后不会立即执行,而是首先排队。

Redis 一个完整的事务过程,分为三个阶段

  • 开启事务(multi)
  • 命令入队(业务操作)
  • 执行事务(exec)或取消事务(discard)
> multi
OK
> incr star
QUEUED
> incr star
QUEUED
> exec
(integer) 1
(integer) 2
  • 所有的指令在 exec 之前不执行,而是缓存在服务器的一个事务队列中,服务器一旦收到 exec 指令,才开执行整个事务队列,执行完毕后一次性返回所有指令的运行结果。
  • Redis 事务可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。

事务相关的命令

  • MULTI:开启事务
  • EXEC:执行事务,返回一个数组,数组中是事务所有命令的响应。
  • DISCARD:取消事务
  • WATCH:观察给定的key,用来决定是否执行MULTI/EXEC,类似CAS机制。
    • EXEC成功执行后,所有WATCH的key都会释放。
    • WATCH实现的CAS不会有ABA的问题。

事务提供的保证

  1. Redis事务中的所有命令都是线性执行的,中间不会对别的客户端做响应。
  2. 保证操作的原子性,要么所有命令都执行,要么都不执行
  3. redis命令并不支持回滚操作

事务执行中可能的错误

  1. 事务开启后执行一个命令时,此命令有语法错误(类似编译错误)。这种情况里,此事务一般会直接抛弃掉。
  2. 执行EXEC时,发现某个命令有异常(类似RuntimeException)。这种情况里,此事务仍然会执行,但错误的命令会返回ERR。

总结

Redis 事务在发送每个指令到事务缓存队列时都要经过一次网络读写,当一个事务内部的指令较多时,需要的网络 IO 时间也会线性增长。所以通常 Redis 的客户端在执行事务时都会结合 pipeline 一起使用,这样可以将多次 IO 操作压缩为单次 IO 操作。