Redis——事务

reids集群不支持事务

ACID

  • 相对于Mysql中的原子性,Redis中的原子性只保证若干个操作都执行或者都不执行,如果中间某条指令执行失败也不会回滚。
  • 无持久性(因为不同的持久化策略可能会丢失或多或少的修改)
  • 不涉及隔离性(redis串行,两个事务之间本身就没有交集)
  • 无一致性

事务的原理

  1. 开启事务:当客户端发送**MULTI**命令时,Redis服务器会在该客户端的状态上设置一个事务标识。

  2. 命令入队:此后,客户端发送的普通命令不会被立即执行。服务器会将这些命令解析后,存入与该客户端关联的事务队列中,并向客户端回复 QUEUED 表示入队成功。

  3. 如果中间想取消事务,也就是丢弃之前,那就发送discard命令。

  4. 执行事务:当客户端发送**EXEC**命令时,服务器会遍历该客户端的事务队列,按照先进先出(FIFO) 的顺序依次执行队列中的所有命令,中间不会执行其他客户端的命令。执行完毕之后客户端返回队列中所有命令的执行结果。


watch

WATCH 是 Redis 为实现事务的乐观锁而提供的命令。它用于在事务执行前监视一个或多个键,如果在执行事务 (EXEC) 时,被监视的键被其他客户端修改了,那么整个事务将被取消,从而保证数据的一致性。unwatch可以取消监视。

之所以说他是乐观锁,是因为watch假设数据在大多数情况下不会发生冲突,因此在操作数据时并不加锁以防止大量冲突导致事务频繁取消,而是只在最终执行事务时检查数据是否被修改过

实现原理

它的实现原理就是给被监视的key一个版本号,之后每次对该key修改都会自增版本号,等事务exec时检查这个key的版本号是否等于初始版本号,如果不等于就说明key被修改过,事务取消。

使用示例