回答
首先,Redis 是支持事务的。Redis 的事务机制提供了一种一次性、按顺序执行一组命令的机制。
它的实现原理是将一组命令压入到事务队列中,然后按照 FIFO 的顺序依次执行,同时在执行这一组命令期间不允许其他命令插入,保证了这组命令在一个原子操作中完成。
Redis 提供以下 5 个命令来实现事务:
MULTI
:用来标记一个事务块的开始。EXEC
:执行事务块中的所有命令。DISCARD
:取消事务,放弃执行事务块内的所有命令。这个命令会清除事务队列并退出事务。WATCH
:用于乐观锁,它可以监视一个或多个键,如果在执行事务前这些键被其他命令改变了,那么事务将被取消(EXEC
会返回null表示事务未执行)UNWATCH
:取消 WATCH 命令对所有 key 的监视。
Redis 事务详解
在 Redis 中,一个事务从开始到结束会经历以下3个阶段:
- 事务开始
- 命令入队
- 事务执行
由 MULTI
命令开启事务,EXEC
命令执行事务,其形式如下:
multi
command1()
command2()
...
commandn()
exec/discard
multi
标志着事务的开始,在 multi
之后的命令都不会执行,全部进入事务队列中,直到服务器接收 exec 或者 discard 才会开始执行或者放弃整个事务,当执行完整个事务后,Redis 会一次性返回所有命令的运行结果。如下:
事务开启:MULTI
MULTI
标志着事务的开始,可以将执行该命令的客户端从非事务态切换的事务态。
从 MULTI
命令后,Redis 接受该客户端的后续命令后并不会立刻执行,而是将其放置在事务队列中。
该命令的运行如下:
127.0.0.1:6379> MULTI
OK
总是会返回 OK 字符串。
命令入队
当客户端处于非事务态时,这个客户端发送的命令会被立刻执行:
当客户端使用 MULTI
命令进入事务态,这个时候客户端发送的命令不会立刻执行,而是将其放入到事务队列中,向客户端回复 QUEUED
,如下:
事务执行:EXEC
当我们在一个处于事务态的客户端执行EXEC
,服务器会按照 FIFO 的顺序执行该客户端对应的事务队列中所有命令,然后将执行结果一次性返回给客户端:
使用 EXEC
执行后,客户端会恢复到非事务状态。
事务取消:DISCARD
DISCARD
清除所有先前在一个事务中放入的队列的命令,然后恢复到非事务状态。
监视器:WATCH
WATCH
用于在执行事务时监视一个或多个 key。如果在事务执行之前,这些键的值被其他命令改变了,那么这个事务将会被拒绝执行,并向客户端返回 nil。
即,在一个事务开始之前,我们可以通过 WATCH
命令监视一个或多个 key。一旦某个 key 被WATCH
,如果该 key 在我们执行 EXEC
命令之前被修改(包括设置新值、删除等),Redis 将取消这个事务的执行。例如:
我们用 WATCH
监视 key balance,然后开启事务,执行 DECRBY balance 50
,注意这个时候不要立刻执行 EXEC
,我们需要另开一个客户端,将 balance 改变:
然后再执行 EXEC
:
这个时候客户端会返回 nil,表明拒绝了该事务的执行。
最后
一般不推荐在实际工作中使用 Redis 事务,原因是 Redis 事务有诸多坑:
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。