Redis的事务

本文记录Redis学习过程中遇到的事务~

和众多其它数据库一样,Redis也同样提供了事务机制。在Redis中,multi/exec/discard这三个命令是我们实现事务的基石。

Redis事务的特征:

  1. 在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事务中的所有命令被原子的执行;
  2. 和关系型数据库中的事务相比,在Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行;
  3. 可以通过“multi”命令开启一个事务,对应于关系型数据库中的“begin transaction"语句。在该命令之后执行的命令都将被视为事务之内的操作,最后我们可以通过执行exec/discard命令提交/回滚该事务之内的所有操作,对应于关系型数据库中的commit/rollback语句;
  4. 在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而,如果网络中断事件是发生在客户端执行exec命令之后,那么该事务中的所有命令都会被执行;
  5. 当使用Append-Only模式时,Redis会通过调用系统函数write将该事务内所有写操作在本次调用中全部写入磁盘。然而,如果在写入的过程中出现系统崩溃,那么此时就可能只有部分数据被写入到磁盘,而另外一部分数据却已经丢失。Redis服务器会在重新启动时执行一系列必要的一致性检测,一旦发现类似问题,就会立即退出并给出相应的错误提示。此时,就要充分利用Redis工具包中提供的redis-check-aof工具,该工具可以帮助我们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启动Redis服务器了。

常用命令:

  • multi:开启事务,其后执行的命令都会被存入命令队列;
  • exec:提交事务;
  • discard:回滚事务。

示例代码:

set num 1
get num
multi
incr num
exec
get num
multi
incr num
discard
get num

标签: none