章节目录
Redis详解1.安装及使用
Redis详解2.数据结构
Redis详解3.发布订阅
Redis详解4.事务
Redis详解5.数据持久化
Redis详解6.主从模式
Redis详解7.哨兵模式
Redis详解8.Cluster模式
1 Redis事务简介
有时为了处理多个key的数据,我们需要向Redis发送多个命令,尽管Redis有几个可以在两个键之间复制或移动元素的命令,但是该部分功能不足以满足生产环境需求,而且也没有不同数据类型之间操作的命令。为了能够在操作多个key的时候保持事务,需要使用Redis的事务功能。
2 基本事务命令
基本的事务操作由以下三个命令构成:MULTI(开启事务)、EXEC(提交事务)。
使用事务
- 执行MULI命令
- 然后输入那些我们想要在事务里面执行的命令
- 最后再执行EXEC命令。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET age 18
QUEUED
127.0.0.1:6379> SET salary 25000
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
事务过程
- 当 Redis从一个客户端那里接收到MULI命令时,Redis会将这个客户端之后发送的所有命令都放入到一个队列里面,直到这个客户端发送EXEC命令为止,然后Redis就会在不被打断的情况下,一个接一个地执行存储在队列里面的命令。
- 当一个事务执行完毕后,Redis才会处理其他客户端的命令。
- 当EXEC命令被调用之前不会执行任何当操作。
延迟执行事务有助于提升性能
Redis在执行事务的过程中,会延迟执行已入队的命令直到客户端发送EXEC命令为止。因此,很多 Redis客户端都会等到事务包含的所有命令都出现了之后,才一次性地将MULTI命令、要在事务中执行的一系列命令,以及EXEC命令全部发送给 Redis,然后等待直到接收到所有命令的回复为止。这种“一次性发送多个命令,然后等待所有回复出现”的做法通常被称为流水线,它可以通过减少客户端与Redis服务器之间的网络通信次数来提升Redis在执行多个命令时的性能。
Redis事务的不足
Redis的事务没有关系数据库事务提供的回滚(rollback)功能,为此开发者必须在事务执行出错后自己处理错误。如下所示:
127.0.0.1:6379> MULTI
OK
# 由于age是string类型所以下面这条语句会失败
127.0.0.1:6379> sadd age 10
QUEUED
127.0.0.1:6379> set salary 30000
QUEUED
127.0.0.1:6379> EXEC
1) (error) WRONGTYPE Operation against a key holding the wrong kind of value
2) OK
# 从结果可以看出虽然第一条语句执行失败,但第二条语句执行成功了
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> get salary
"30000"
3 事务进阶命令
DICCARD
- 取消事务,放弃执行事务块内的所有命令。
- 如果正在使用WATCH命令监视某个key,那么取消所有监视,等同于执行命令UNWATCH。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET age 20
QUEUED
127.0.0.1:6379> SET salary 30000
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> GET age
"18"
127.0.0.1:6379> GET salary
"25000"
WATCH
- 监视一个(或多个) key
- 如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> get salary
"30000"
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 20
QUEUED
# 此时用另一个client执行set age 5的操作
127.0.0.1:6379> set salary 30000
QUEUED
127.0.0.1:6379> EXEC
# 由于age被其他client修改,放弃事务
(nil)
127.0.0.1:6379> set age 5
OK
UNWATCH
- 取消WATCH命令对所有key的监视。
- 如果在执行WATCH命令之后, EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了。
网友评论