你真的懂Redis事务吗?

MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务的基础。
事务能够一次执行多个命令, 而且带有如下两个重要的保证:redis

  • 事务是一个单独的隔离操做:事务中的全部命令都会序列化、按顺序地执行。事务在执行的过程当中,不会被其余客户端发送来的命令请求所打断。
  • 事务是一个原子操做:事务中的命令要么所有被执行,要么所有都不执行。
    EXEC 命令负责触发并执行事务中的全部命令:

当使用 AOF 方式作持久化的时候, Redis 会使用单个 write(2) 命令将事务写入到磁盘中。
然而,若是 Redis 服务器由于某些缘由被管理员杀死,或者赶上某种硬件故障,那么可能只有部分事务命令会被成功写入到磁盘中。
若是 Redis 在从新启动时发现 AOF 文件出了这样的问题,那么它会退出,并汇报一个错误。
使用 redis-check-aof 程序能够修复这一问题:它会移除 AOF 文件中不完整事务的信息,确保服务器能够顺利启动。服务器

  • 若是客户端在使用 MULTI 开启了一个事务以后,却由于断线而没有成功执行 EXEC ,那么事务中的全部命令都不会被执行。
  • 另外一方面,若是客户端成功在开启事务以后执行 EXEC ,那么事务中的全部命令都会被执行。

从 2.2 版本开始,Redis 还能够经过乐观锁(optimistic lock)实现 CAS (check-and-set)操做,具体信息请参考文档的后半部分。spa

用法

MULTI 命令用于开启一个事务,它老是返回 OK 。
MULTI 执行以后, 客户端能够继续向服务器发送任意多条命令, 这些命令不会当即被执行, 而是被放到一个队列中, 当 EXEC 命令被调用时, 全部队列中的命令才会被执行。
另外一方面, 经过调用 DISCARD , 客户端能够清空事务队列, 并放弃执行事务。
如下是一个事务例子, 它原子地增长了 foo 和 bar 两个键的值:队列

相关文章
相关标签/搜索