更多技术文章,请关注我的个人博客 www.immaxfang.com 和小公众号
Max的学习札记
。
Redis 事务简介
Redis 只是提供了简单的事务功能。其本质是一组命令的集合,事务支持一次执行多个命令,在事务执行过程中,会顺序执行队列中的命令,其他客户端提交的命令请求不会插入到本事务执行命令序列中。命令的执行过程是顺序执行的,但不能保证原子性。无法像 MySQL 那样,有隔离级别,出了问题之后还能回滚数据等高级操作。后面会详细分析。
Redis 事务基本指令
Redis 提供了如下几个事务相关的基础指令。
MULTI
开启事务,Redis 会将后续命令加到队列中,而不真正执行它们,直到后续使用EXEC
来原子化的顺序执行这些命令EXEC
执行所有事务块内的命令DISCARD
取消事务,放弃执行事务块内所有的命令WATCH
监视一个或多个 key,若事务在执行前,这些 key 被其他命令修改,则事务被终端,不会执行事务中的任何命令UNWATCH
取消WATCH
命令对所有 keys 的监视
一般情况下,一个简单的 Redis 事务主要分为如下几个部分:
- 执行命令
MULTI
开启一个事务。 - 开启事务之后,执行命令的多个命令会依次被放入一个队列,放入成功则会返回
QUEUED
消息。 - 执行命令
EXEC
提交事务,Redis 会依次执行队列中的命令,并依次返回所有命令的结果。(若想放弃提交事务,则执行DISCARD
)。
下图简单介绍了下 Redis 事务执行的过程:
实例分析
下面我们来通过一些实际具体例子,来体会下 Redis 中的事务。前面我们也说到 Redis 的事务不是正真的事务,是无法完全满足标准事务的 ACID
特性的。通过下面的例子,我们来看看,Redis 的”破产版”事务到底存在什么问题。
- [A]正常执行提交
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET a 1
QUEUED
127.0.0.1:6379> SET b 2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
127.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> MULTI
OK
127.0.0.1:6379> SET a 1
QUEUED
127.0.0.1:6379> SET b 2
QUEUED
127.0.0.1:6379> DISCARD
OK
127.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
`c
— 线程 1 中执行
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379> SET a 0
OK
127.0.0.1:6379> WATCH a
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET a 1
QUEUED
Original: https://www.cnblogs.com/immaxfang/p/16837796.html
Author: immaxfang
Title: 说说 Redis 事务
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/799916/
转载文章受原作者版权保护。转载请注明原作者出处!