更多技术文章,请关注我的个人博客 www.immaxfang.com 和小公众号Redis 事务简介Redis 只是提供了简单的事务功能 。其本质是一组命令的集合,事务支持一次执行多个命令,在事务执行过程中,会顺序执行队列中的命令,其他客户端提交的命令请求不会插入到本事务执行命令序列中 。命令的执行过程是顺序执行的,但不能保证原子性 。无法像 MySQL 那样,有隔离级别,出了问题之后还能回滚数据等高级操作 。后面会详细分析 。Max的学习札记
。
Redis 事务基本指令Redis 提供了如下几个事务相关的基础指令 。
MULTI
开启事务,Redis 会将后续命令加到队列中,而不真正执行它们,直到后续使用EXEC
来原子化的顺序执行这些命令EXEC
执行所有事务块内的命令DISCARD
取消事务,放弃执行事务块内所有的命令WATCH
监视一个或多个 key,若事务在执行前,这些 key 被其他命令修改,则事务被终端,不会执行事务中的任何命令UNWATCH
取消WATCH
命令对所有 keys 的监视
- 执行命令
MULTI
开启一个事务 。 - 开启事务之后,执行命令的多个命令会依次被放入一个队列,放入成功则会返回
QUEUED
消息 。 - 执行命令
EXEC
提交事务,Redis 会依次执行队列中的命令,并依次返回所有命令的结果 。(若想放弃提交事务,则执行DISCARD
) 。
文章插图
实例分析下面我们来通过一些实际具体例子,来体会下 Redis 中的事务 。前面我们也说到 Redis 的事务不是正真的事务,是无法完全满足标准事务的
ACID
特性的 。通过下面的例子,我们来看看,Redis 的“破产版”事务到底存在什么问题 。- [A]正常执行提交
127.0.0.1:6379> MULTIOK127.0.0.1:6379> SET a 1QUEUED127.0.0.1:6379> SET b 2QUEUED127.0.0.1:6379> EXEC1) OK2) OK127.0.0.1:6379> GET a"1"127.0.0.1:6379> GET b"2"
开启事务后,提交的命令都会加入队列(QUEUED),执行 EXEC 后会逐步执行命令并返回结果 。这个看起来是不是和我们平时使用 MySQL 的事务操作相似,类似 start transaction 和 commit 。- [B]正常取消事务
127.0.0.1:6379> MULTIOK127.0.0.1:6379> SET a 1QUEUED127.0.0.1:6379> SET b 2QUEUED127.0.0.1:6379> DISCARDOK127.0.0.1:6379>127.0.0.1:6379> GET a(nil)127.0.0.1:6379> GET b(nil)
开启事务后,若不想继续事务,使用 DISCARD 取消,前面提交的命令并不会真正执行,相关的 key 值不变 。这个看起来也和 MySQL 的事务相似,类似 start transaction 和 rollback 。- [C]WATCH 监视 key
-- 线程 1 中执行127.0.0.1:6379> del a(integer) 1127.0.0.1:6379> get a(nil)127.0.0.1:6379> SET a 0OK127.0.0.1:6379> WATCH aOK127.0.0.1:6379> MULTIOK127.0.0.1:6379> SET a 1QUEUED----------------------------------------- 线程 2 中执行----------------------------------------- 127.0.0.1:6379> SET a 2----------------------------------------- OK127.0.0.1:6379> EXEC(nil)127.0.0.1:6379> GET a"2"
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Spring事务传播行为实战
- 暗示某人嘴贱的句子 想发一个骂人的朋友圈说说
- 关于苦与甜的优美句子 苦尽甘来的短句说说
- 骂变态带脏字越难听越好 讽刺小人的经典说说
- 17 基于SqlSugar的开发框架循序渐进介绍-- 基于CSRedis实现缓存的处理
- 关于开车的搞笑句子 开破车泡妞的说说
- 家人的关心最温暖词句 有亲人的关心真好的说说
- 关心家庭的话语暖心说说 情商高的人感谢亲人的话
- 人心太假太虚伪的句子说说 明白一些事看清一些人
- 哪些星座说爱你只是说说还是用心的