Redis事务

MULTI 、 EXEC 与 WATCH

当输入MULTI时,标志着事务的开始,之后命令入队,当输入EXEC时,表示开始执行事务。

WATCH命令是一个乐观锁(optimistic locking),它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复。

WATCH功能的实现原理:每个Redis数据库都保存着一个watched_keys字典,这个字典的键是某个被WATCH命令监视的数据库键,而字典的值则是一个链表,链表中记录了所有监视相应数据库键的客户端。所有对数据库修改的命令,在执行完这些命令之后,Redis就会从字典中查看刚刚修改的键是否被其他客户端监视,如果是的话,那么就将该客户端的CAS标识打开,表明该客户端的事务安全性被破坏。因此当服务器收到了一个客户端发来的EXEC命令时,它会先判断该客户端的CAS标识是否被打开,如果被打开,那就拒绝执行,反之可以正常执行。

原子性

有三种情况:

1.正常情况下,MULTI开启事务之后,输入的命令正常入队,EXEC提交之后,所有命令正常执行。

2.事务因为某条命令入队出错而被拒绝执行。比如我们只输入了一个GET那么服务器就会拒绝执行本次事务。

3.所有命令成功入队,但是在执

### Redis 事务机制概述 Redis 使用 `MULTI`、`EXEC`、`DISCARD` 和 `WATCH` 命令来实现事务功能[^2]。这些命令使得一组命令可以作为一个整体被执行,确保它们要么全部成功执行,要么都不执行。 #### 事务特点 - **原子性**:虽然 Redis事务不提供严格的 ACID 中的原子性,但在执行过程中,所有命令会按照顺序依次执行,不会被打断。 - **一致性**:当命令语法错误、命令执行错误或 Redis 发生意外故障时,Redis 事务机制能够保证数据的一致性[^3]。 - **隔离性**:事务中的所有命令会被序列化并按顺序执行,在整个过程里不会受到其他客户端的影响[^4]。 #### 主要命令解释 - **MULTI**:标记一个事务块的开始。之后所有的命令都将被放入队列中等待执行。 - **EXEC**:触发之前排队的所有命令一次性执行,并返回各个命令的结果列表。 - **DISCARD**:取消当前事务,清空已经入队但是还未执行的命令。 - **WATCH**:监视键的变化情况;如果在 WATCH 后有任何修改,则 EXEC 执行失败,以此支持乐观锁的功能[^1]。 #### 错误处理与回滚特性 需要注意的是,即使某个命令在事务内发生了运行期错误(比如除零),这并不会导致整个事务自动回滚——只有那些确实能完成的操作才会生效,而无法继续下去的部分则停止尝试。因此开发者应该自行设计合理的逻辑去应对可能出现的问题。 ```bash # 开始一个新的事务 MULTI # 将几个命令加入到事务队列中 SET key1 "value" INCR key2 LPUSH mylist "item" # 提交事务 EXEC ``` 对于更复杂的业务需求来说,还可以利用 Lua 脚本来编写更加紧凑高效的程序片段来进行批量操作,从而达到类似的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值