Redis之事务底层实现

一,redis事务

      1,redis事务使用到的命令
            multi,exec,watch
      2,事务简介
            a,概念:事务是一系列命令的集合;
      b,特点:
            事务是一次性,也就是原子性;
            事务是按顺序执行多个命令;
            服务器在执行事务的期间,不会中断事务的执行,而去执行其他的命令,而是会将事务中所有的命令执行完毕,再去执行其他客户端传来的命令;

一,事务的实现

      1,事务开始到结束所经历的阶段
            a,事务开始
            b,命令入队
            c,事务执行
      2,事务开始
            a,命令:multi
            b,作用:当执行了multi命令之后,那么客户端就会从非事务状态切换到事务状态;
      3,命令入队
            a,条件:客户端处于事务状态
            b,命令入队:对multi,exec,watch,discard四个命令之外的命令,服务器会将命令放进事务队列里面,然后返回给客户端queued
      c,事务队列的结构
事务队列的本质是一个数组,较早入队的命令,放入到数组前面,较后的放入到队列后面;事务队列如下所示:multiState是redisClient中的一个属性
Redis之事务底层实现
      4,执行事务
            a,执行时机和结果:当一个处于事务状态的客户端,执行了exec命令,那么服务器就会遍历客户端这个事务队列,然后按顺序的执行里面的命令,然后将执行的结果全部返回给客户端;
      b,举例:
Redis之事务底层实现

二,watch命令的实现

      1,作用
            他可以在exec命令执行之前监视任意数量的数据库键,当在exec命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器拒绝执行事务,并向客户端返回一个空回复;
      2,watch命令底层使用的数据结构
            每个redis数据库都保存者一个watched_key字典,这个字典的键是被watch命令监视数据库键,值是有链表组成的,监视数据库键的客户端,结构如下所示:
Redis之事务底层实现
      3,监视机制触发
            a,触发时机:所有对数据库进行修改的命令,比如set,del等命令,都会触发touchWatchKey函数对watched_keys字典进行检查,查看是否有客户单在监视的数据库键被修改过了,如果有的话,那么就将客户单的redis_dirty_cas表示打开,表示客户端的事务安全性已经被破坏;
      4,判断事务是否安全
            a,判断流程:当一个客户端执行了exec命令,服务器会根据这个是否打开了redis_dirty_cas标识,当该标识被打开,表示事务的安全性遭到了破坏,因此服务器会拒绝执行该事务;如果该表示没有被打开,那么服务器就会执行该事务

三,事务的ACID性质

      1,原子性
            数据库将事务中的多个操作看做是一个整体,要么所有得操作都执行,要么一个也不执行;
      2,一致性
            a,概念:事务执行之前是一致的,事务执行之后也是一致的;
            b,一致的概念:数据符合数据库本身的定义和要求,不包含非法或者无效的错误数据;
            c,redis对于会引起数据不一致性的处理
入队错误:如果一个事务在入队命令的过程中,出现了命令不存在,或者命令格式不正确,那么redis服务器就会拒绝执行这个事务;
执行错误:只有在执行命令的时候才会被发现,那么redis服务器不会中断事务的执行,而是继续执行剩余的命令;
服务器停机:无论redis处于持久化模式下,还是非持久化模式下面,都不会影响数据的一致性;
      3,隔离性
            并发执行事务之间是不会相互影响的,也就是说,并发执行的事务和事务的串行执行结果是一样的;
      4,持久性
            a,特点:事务执行完毕,被事务执行的数据就会被写道永久性的存储介质中;即使服务器在事务执行之后停机,事务执行的结果也不会丢失
            b,redis持久性的特点:redis的事务知识一个包含了多个命令的队列,因此redis的持久性拒绝去持久化机制;如服务器运行在非持久化模式下,那么redis不具有持久性;如果运行在aof持久化模式下,并且配置的是always,那么事务具有持久性;其他情况持久化模式下,事务都不具有持久性;