Redis事务

2019/04/20 分布式

Redis事务

1.相关命令

MULTI,EXEC,DISCARD,WATCH命令是Redis事务功能的基础。

  • MULTI

    用于标记事务块的开始,总是返回OK。

    后续的命令会逐个放入队列中,然后才能使用EXEC命令原子化的执行这个命令序列。

  • EXEC

    在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。

    当使用WATCH命令时,只有当受监控的键没有被修改时,EXEC命令才会执行事务中的命令,这种方式利用了CAS机制。

    返回值是一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。当使用WATCH命令时,如果事务执行中止,那么返回NULL值。

  • DISCARD

    清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。总是返回OK。

    如果使用了WATCH命令,那么就会将当前连接监控的所有键取消监控。

  • WATCH

    当某个事务需要按条件执行时,使用这个命令将给定的键设置为受监控的,作为事务执行的条件。总是返回OK。

2. 两个保证

这些命令显式的开启并控制一个事务,允许在一个步骤中执行一组命令,并提供两个重要的保证:

  • 事务中的所有命令都会被序列化并按顺序执行。在执行Redis事务的过程中,不会出现由另一个客户端发出的请求。这保证命令队列作为一个单独的原子操作被执行。

  • 队列中的命令要么全部被处理,要么全部被忽略。EXEC命令触发事务中所有命令的执行,当客户端与服务器之间出现通信故障,

    • 如果发生在EXEC命令被调用之前,则不会执行任何命令;

    • 如果发生在EXEC命令被调用之后,则所有命令都会被执行。

    Redis使用只增文件AOF(append-only file),使用一个额外的write操作将事务写入磁盘。如果发生宕机,进程崩溃等情况,可以使用redis-check-aof 工具修复AOF,将会从AOF中删除执行不完全的事务。

    Redis中单个命令是原子性的,事务可以保证队列中所有任务全部都执行或者全部不执行,但是不能保证所有操作是原子性的,其中任何一个发生错误,其他命令仍然能够执行。

3.不支持Rollback

Redis命令在事务执行时可能会失败,但仍然会继续执行剩余命令而不是回滚。主要原因是,当Redis开始执行事务中的命令时,如果执行失败,仅仅是由于错误的语法被调用导致的,Redis不保证这种错误。

4.与关系型数据库事务对比

对比ACID四个特性,Redis事务只能支持隔离性,而且也没有隔离级别的概念,队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这些问题。

参考:

理解Redis事务

Redis事务介绍

Search

    Table of Contents