1.事务有哪些特征?redis支持哪些?

事务的四大特征是ACID,原子性,一致性,隔离性,持久性(详见MySQL篇)
而我们redis永远是具有一致性和隔离性的。因为redis是单线程的,所以线程在进行读写操作的时候都会不会对其他线程造成影响,保证了隔离性。并且没有多线程竞争的情况,也就保证了一致性。
如果我们配置了AOF模式持久化策略的话,也能保证redis的持久性。但是在事务情况下,redis保证不了原子性。

2.redis能保证原子性吗?如果事务操作发生了错误,redis能够回滚吗?

首先,redis本身的单个操作都是原子性操作,但是在事务多个操作的情况下,redis不能保证原子性。也就是说,如果发生了错误,redis不能回滚。某条操作发生了错误后,依然会继续执行后面的操作。

3.Redis事务的大致执行流程是什么?

大致的可以分为三个阶段:开启事务、命令入队、执行事务
具体来说的话就是redis是通过几个命令组合对事务进行操作,如MULTI、EXEC(execution缩写)、DISCARD、WATCH、UNWATCH等
开启事务MULTI
客户端发送MULTI执行,服务端执行MULTI指令逻辑,把客户端从非事务状态变成事务状态。
命令入队
所有事物指令在EXEC之前都不会真正的执行,而是有redis进行预执行并进行格式校验,如果有错则直接返回错误,如果正确则添加到一个事物队列中。
执行事务EXEC
当客户端发送EXEC指令,redis才会去真正的执行事务
DISCARD:取消事务
WATCH:监控。
WATCH可以在MULTI指令之前监控某些键值对,当执行EXEC指令的时候,首先会去执行WATCH,看被他监控的那些键值对有没有发生变化,如果发生了变化,则直接取消执行事务,并返回提示给客户端。如果没有发生变化,则取消WATCH,并执行EXEC。WATCH可以算是类似于乐观锁思想的一种实现。
UNWATCH:取消监控