事务的实现

事务是通过MULTI命令开始的,在非事务状态下客户端发送的命令会被立刻执行,而在事务状态下,除了EXEC/WATCH/DISCARD这几个命令外,redis会将命令保留在事务队列里。

typedef strcut redisClient{    //事务状态    multiState mstate;    ...}redisClient;typedef struct multiState{    //事务队列 FIFO    multiCmd *commands;    //已入队命令计数    int counts;}multiState;typedef struct multiCmd{    //参数    robj *args;    //参数数量    int argc;    //命令指针    struct redisCommand *cmd;}multiCmd;

当一个处于事务状态的客户端向服务器发送EXEC命令时,服务器会遍历这个客户端的事务队列并执行队列里的所有命令,最初将执行命令后的所有后果返回给客户端。

redis事务的ACID

redis是具备原子性、一致性、隔离性的,不过不具备性情的持久性。

  • 对于redis的事务性来说,事务队列中的命令要么全副执行要么一个都不执行,不过redis并不反对事务的回滚,这是它与关系性数据库很大的一个区别。
  • redis是应用单线程的形式来执行事务,且事务在执行的过程中不会被中断,也就是说redis的事务总是以串行的形式运行的,这样其事务也就具备了隔离性。
  • 事务的持久性是指一个事务执行结束时,执行这个事务所得的后果曾经被保留到了永恒存储介质里,即便服务器在事务执行后停机,执行所得的后果也不会失落。redis将数据写入内存后,会依据长久化配置将数据同步到磁盘里,这其实是有一个滞后过程的,显然redis并不具备这一个性

本文参考的有:
黄健宏的《Redis设计与实现》一书