👌什么是redis事务机制?
口语化回答
好的,面试官,redis 的事务机制不算是一个像 mysql 一样的正常的事务,只是保证了正常情况下的原子性,一场情况不提供回滚机制。redis 主要是将事务的命令,放在一个队列,一起准备顺序执行。主要是 multi,exec,watch 命令配合使用。使用非常简单,先标记事务开始后,放入命令,再通过 exec 执行即可。以上。
题目解析
实际场景的事务还是用的很少的,这道题也不是特别重点,了解一下 redis 这个事务特性即可。
面试得分点
原子性、不支持回滚、watch 乐观锁
题目详细答案
redis中事务是一组命令的集合,一组命令要么全部执行,要么全部不执行。事务在Redis中是通过流水线(Pipeline)技术实现的,所有命令在执行之前都会被放入一个队列中,直到执行EXEC命令时,所有命令才会按顺序执行。
命令操作
MULTI
MULTI命令用于标记一个事务的开始。执行MULTI后,所有的命令都会被放入一个队列中,而不是立即执行。
1 | MULTI |
EXEC
EXEC命令用于执行从MULTI命令开始后放入队列中的所有命令。所有命令会按顺序执行,并且在执行过程中不会被其他客户端的命令打断。Redis事务在执行EXEC命令时具有原子性,即所有命令要么全部执行,要么全部不执行。Redis事务并不支持回滚机制。如果在事务执行过程中发生错误,已经执行的命令不会被回滚。
1 | EXEC |
DISCARD
DISCARD命令用于放弃从MULTI命令开始后放入队列中的所有命令,并且取消事务。
1 | DISCARD |
WATCH
WATCH命令用于监视一个或多个键,在事务执行之前,如果这些键被其他客户端修改,事务将被中止。WATCH命令通常用于实现乐观锁。这样可以防止事务中的数据竞争问题。
1 | WATCH key1 key2 |
事务的工作原理
事务的执行过程
1、 开始事务:使用MULTI命令开始一个事务。
2、 命令入队:在事务开始之后,所有的命令都会被放入队列中,而不是立即执行。
4、 执行事务:使用EXEC命令执行队列中的所有命令。如果在使用WATCH监视的键在事务执行前被修改,事务将被中止。
4、 放弃事务:使用DISCARD命令可以放弃当前事务队列中的所有命令。
代码示例
1 | # 开始事务 |
如果在事务执行之前,使用WATCH命令监视了某个键,并且该键在事务执行前被修改,事务将被中止:
1 | # 监视键 |