提到事务,相信大家都不陌生,事务的ACID四大特性,也是面试时经常问的,不过一般情况下,我们可能想到的是传统关系型数据库的事务,其实,Redis也是提供了事务机制的,本篇博客就来讲解下Redis的事务机制。 1. 事务演示Redis的事务提供了一种将多个命令请求打包,然后一次性、按顺序性地执行多个命令的机制。 在事务执行期间,服务器不会中断事务而去执行其它客户端的命令请求,它会将事务中的所有命令执行完毕,然后才去处理其它客户端的命令请求。 下图展示了一个Redis事务的执行过程: 可以看出,事务以 2. 事务实现原理一个事务从开始到结束会经历以下3个阶段:
2.1 事务开始
执行完该命令后,客户端状态的flags属性会打开REDIS_MULTI标识,表示该客户端从非事务状态切换至事务状态。 2.2 命令入队当一个客户端处于非事务状态时,这个客户端发送的命令会立即被服务器执行: 当一个客户端处于事务状态时,这个客户端发送的命令,服务器是否会立即执行,分为以下2种情况:
以上流程可以使用以下流程图来表示: 这里首先提下 然后提下事务队列,每个Redis客户端都有自己的事务状态,事务状态存储在客户端状态的mstates属性里: 事务状态包含1个事务队列和1个已入队命令的数量,如下所示: 事务队列是一个multiCmd类型的数组,数组中的每个multiCmd结构保存了一个已入队命令的相关信息,比如:
事务队列以先进先出(FIFO)的方式保存入队的命令。 2.3 事务执行当一个处于事务状态的客户端执行 3. WATCH命令的实现原理
为了更好的理解,我们做个演示,首先,我们打开客户端1,执行 此时,先不要执行EXEC命令,打开客户端2,执行以下命令修改“name”键的值: 然后,在客户端1执行EXEC命令时,会返回空回复,因为“name”键的值在客户端2已经被修改: 那么,
3.1 使用WATCH命令监视数据库键每个Redis数据库都保存着1个 举个例子,假如客户端1正在监视键“name”,客户端2正在监视键“age”,那么 如果此时客户端3执行了以下 那么 3.2 监视机制的触发那么问题来了,既然 答案是所有对数据库修改的命令,比如 以上图为例,如果键“name”的值被修改,那么客户端1、客户端3的 3.3 判断事务是否安全最后非常关键的一步是,当服务器接收到一个客户端发来的 4. 事务执行失败举例先来看第1个例子,这个事务因为命令入队出错被服务器拒绝执行,事务中的所有命令都不会被执行: 再来看第2个例子,事务入队时出现了不存在的命令,服务器将拒绝执行这个事务: 再来看第3个例子, 这个例子也说明Redis事务不支持回滚机制。 5. 总结Redis的事务提供了一种将多个命令打包,然后一次性、有序地执行的机制, 它的原理是多个命令会被入队到事务队列中,然后按先进先出(FIFO)的顺序执行, 并且事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。 6. 参考黄健宏 《Redis设计与实现》 |
|