在 Redis 中,事务是一组被作为一个单元执行的命令集合。与传统的关系型数据库事务不同,Redis 的事务没有提供像 回滚 或 提交 这样的功能,但它依然通过一些机制确保命令的原子性。
Redis 事务实现
Redis 事务的基本实现方式是通过 MULTI、EXEC、DISCARD 和 WATCH 等命令来控制。以下是 Redis 事务的核心机制:
1. MULTI
- 使用
MULTI命令来开始一个事务。执行MULTI后,Redis 会进入一个事务块模式,此时所有的命令都会被入队,并不会立即执行。 - 所有在事务中的命令都会被放入一个队列中,直到执行
EXEC命令时,才会按顺序执行。
2. 命令入队
- 在
MULTI命令之后,后续的 Redis 命令(例如SET、INCR、DEL等)不会立即执行,而是被放入事务队列中等待。 - 每个命令会被当作一个普通的命令进行入队,不会检查是否有错误,也不会执行(即使命令有语法错误,也不会立即反馈)。
3. EXEC
- 使用
EXEC命令来执行事务中的所有命令。执行EXEC时,Redis 会按顺序执行所有入队的命令,并返回执行结果。 - 原子性:事务中的所有命令要么全部执行成功,要么在
EXEC时统一执行,不会中途被其他命令打断。这确保了事务的原子性。
4. DISCARD
- 使用
DISCARD命令可以放弃当前事务,撤销事务中的所有命令。如果调用了DISCARD,事务中的命令不会被执行,Redis 会返回 OK。
5. WATCH
WATCH命令用于监视一个或多个键。如果这些键在事务执行前发生变化(被其他客户端修改),则EXEC命令会返回一个空数组,表示事务失败。- 这种机制类似于乐观锁,确保事务在执行时数据不会发生冲突,避免了脏数据。
事务的执行流程
- 客户端执行
MULTI开启事务。 - 客户端接着执行多条 Redis 命令,这些命令都会进入事务队列。
- 客户端执行
EXEC提交事务,Redis 按顺序执行事务队列中的所有命令。 - 如果在事务中使用了
WATCH命令,Redis 会监视指定的键。如果在MULTI和EXEC之间的某个时刻,监视的键被修改,EXEC会返回空数组,表示事务执行失败。
Redis 事务的特点
- 原子性:所有事务中的命令要么全部执行,要么全部不执行。如果事务中的命令执行过程中遇到错误,其他命令依然会被执行。
- 隔离性:Redis 事务在执行过程中会被隔离,不会被其他客户端的操作中断。
- 一致性:Redis 不提供事务中的回滚机制,即事务中的命令一旦入队并执行就会生效,即使执行中出现错误,之前的命令也不能撤销。
- 持久性:Redis 的事务本身并不保证持久化,持久化需要通过 RDB 或 AOF 来实现。
总结
Redis 事务实现通过 MULTI 开始事务,EXEC 提交事务,DISCARD 放弃事务。虽然 Redis 提供了事务的原子性和隔离性,但不像传统关系型数据库那样提供回滚机制。事务的核心功能是确保命令按照顺序、原子性执行,而 WATCH 可以用来实现乐观锁,增加事务执行的可靠性。
261

被折叠的 条评论
为什么被折叠?



