详细说明Redis的事务
人民网>>社会·法治

详细说明Redis的事务

2025-06-24 11:44:52 | 来源:人民网
小字号

目录。

Redis事务。

概念。

特性。

常用命令。

MULTI。

EXEC。

DISCARD。

WATCH。

UNWATCH。

使用演示。

使用场景。

注意事项。


Redis事务。

概念。

在概念上,Redis事务与MySQL事务相似,将一系列操作绑定成一组,让这一组能够批量执行。但是,Redis事务和MySQL事务在特点上有所不同c;Redis事务没有回滚机制,#xff0c;这些操作只能保证批量执行,不能做到“一个失败就会恢复到初始状态”。

Redis 事务本质上是在服务器上做的⼀个 "事务队列". 每次客⼾端在事务中进步⾏⼀个操作, 将命令先发送给服务器, 放到 "事务队列" 中(但不是⽴即执⾏)。
⽽它真的会收到 EXEC 命令之后, 才真正执⾏队列中的所有操作. 。

特性。

1.弱化原子性:
Redis事务中的所有命令都将序列化并按顺序执行,其他客户端的命令请求在执行过程中不会中断。
但是,Redis事务没有回滚机制。如果事务中的命令执行失败,其他命令将继续执行,由于命令的失败,事务不会回到初始状态。
2.不保证一致性:
Redis事务没有回滚机制,不涉及“约束”,因此,如果某个修改操作在事务执行过程中失败,可能会导致不一致。
3.不需要隔离:
Redis是单线程处理请求,因此,不需要隔离级别󿀌执行事务不会并发。
4.不需要持久性:
Redis事务是保存在内存中的,是否开启持久化是redis-server自己的事情,与事务无关。

常用命令。
MULTI。

功能:打开一个事务。
成功执行返回OK。事务开始后,客户端可以继续向服务器发送任何命令,这些命令不会立即执行c;相反,它被放在一个队列中。当调用EXEC命令时󿀌所有队列中的命令都将被执行。

EXEC。

功能:真正执行事务。
每次添加一个操作,都会提示“QUEUED",说明命令已经进入服务端的队列。执行EXEC命令时,只有服务器才能真正执行这些命令。
对EXEC命令的回复是数组,数组中的每个元素都是执行事务中的命令所产生的回复。回复元素的顺序与命令发送的顺序一致。

DISCARD。

功能:放弃当前事务。
直接清空事务队列,以前的操作不会真正执行。

WATCH。

开始事务前一定要使用!!!

功能:监控一个或多个键。
开始事务时,如果修改WATCH键(在EXEC命令执行之前),将记录当前键的“版本号”。真正提交事务时(执行EXEC命令时),如果发现当前服务器上键的版本号已经超过了事务开始时的版本号,会使事务执行失败。
本质上,WATCH命令为EXEC增加了判断条件,属于“乐观锁”。

UNWATCH。

功能:取消对键监控。
相当于WATCH的逆操作。

使用演示。

事务没有开始󿀌一方修改,另一方可以实时看到。

开启事务󿀌一方修改󿀌另一方看不到�直到事务完成 。

开启事务󿀌一方修改󿀌另一方面,修改同一Key󿼌最终value为执行事务设置value 。

在开始事务之前,WATCH只能使用 。

使用WATCH,开启事务󿀌在事务中修改Key之前󿼌Key修改�在事务中修改Key,执行EXEC会提示(nil),Key的value仍然是另一方设置的value。

使用场景。

Redis事务适用于需要包装多个操作的情况。例如,在商品抢购场景中,如果使用Redis事务,可避免多线程下的线程安全问题。通过Redis事务,能保证一系列操作(如检查库存、扣除库存等)原子性执行,避免数据不一致的问题。

注意事项。

1.释放锁#xff1a;
#xff0使用WATCH命令进行乐观锁控制c;事务执行完成后,应注意及时释放锁(即取消对键的监控)。如果忘记释放锁或锁因异常而无法释放#xff0c;可能会导致死锁问题。
2.处理事务失败:
Redis事务没有回滚机制,因此,在设计业务逻辑时需要考虑事务失败的处理方法。例如,命令是否成功执行࿰可以通过检查命令的返回值来判断c;并采取相应的处理措施。
3.避免事务过大:
如果事务太大,#xff08;太多的命令),Redis服务器的性能可能会下降。所以,需要合理控制事务的大小,避免在事务中执行过多的命令。

(责编:人民网)

分享让更多人看到