Redis ACID

2021/02/23 posted in  基础

Redis 事务包含 MULTI 和 EXEC两个命令 完成三个步骤;

  1. 受用MULTI 显示表示一个事务开始
  2. 客户端要把执行的命令发送到服务端,Redis 把命令保存在队列中并不会立即执行
  3. 客户端向服务端发送事务提交命令EXEC,然后执行队列中的命令



原子性

如果不出现错误,通过MULTI和EXEC命令可以事项事务,但是如果有错误就不一定分三种情况

  1. 执行EXEC 命令前,客户端发送的命令有错,提交事务时会失败,保证原子性
  2. 事务入队列时,命令和操作类型不匹配,但是Redis 没有检测出来;这样部分正确命令会正常的执行但是错误的命令就会失败,保证不了原子性
  3. 执行事务EXEC 命令时,Redis 实例发生故障导致事务执行失败,如果开启了AOF 可以保证原子性

原子性总结

  1. 命令入队时报错,会放弃事务,保证原子性
  2. 命令入队时没有错误,实际执行时出现错误,不保证原子性
  3. EXEC执行明时出现Redis实例故障,如果开启AOF 则可以保证原子性

一致性

事务一致性的保证收到错误命令,实例故障影响。

  1. 命令入队错误:会放弃执行事务保证一致性
  2. 入队正确,命令执行错误:错误的命令不能执行,但是正确的命令可以执行,保证不了一致性
  3. EXEC 命令执行时实例故障:没有开启RDB和AOF不能保证一致性,如果开启RDB 因为不会在事务执行时执行RDB 所以不会影响一致性,如果开启AOF,正确可以记录,如果错误通过修复工具可以修复 保证一致性

隔离性

针对命令入队和命令实际执行两个阶段

  1. 并发EXEC执行前,此时隔离需要通过WATCH保证隔离性
  2. 执行EXEC后,可以保证隔离性


针对 1 是否使用功能WATCH 如果使用了,WATCH会在执行事务前监控键值,当执行EXEC 时如果值被修改 则放弃事务保证隔离性



针对 2 并发操作在EXEC命令之后被服务器接受并执行,Redis是单线程执行命令,所以会保证隔离性


持久性

使用RDB不能保证一个事务之后,下一次RDB执行之前的数据得到持久化
使用AOF三种 no,everysec,always 配置都会有数据丢失,所以无论使用哪种都不能保证持久化