Redis详解4.事务

一年又一年,字节跳动 Lark(飞书) 研发团队又双叒叕开始招新生啦!
【内推码】:GTPUVBA
【内推链接】:https://job.toutiao.com/s/JRupWVj
【招生对象】:20年9月后~21年8月前 毕业的同学
【报名时间】:6.16-7.16(提前批简历投递只有一个月抓住机会哦!)
【画重点】:提前批和正式秋招不矛盾!面试成功,提前锁定Offer;若有失利,额外获得一次面试机会,正式秋招开启后还可再次投递。

章节目录

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(提交事务)。

使用事务
  1. 执行MULI命令
  2. 然后输入那些我们想要在事务里面执行的命令
  3. 最后再执行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
事务过程
  1. 当 Redis从一个客户端那里接收到MULI命令时,Redis会将这个客户端之后发送的所有命令都放入到一个队列里面,直到这个客户端发送EXEC命令为止,然后Redis就会在不被打断的情况下,一个接一个地执行存储在队列里面的命令。
  2. 当一个事务执行完毕后,Redis才会处理其他客户端的命令。
  3. 当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
  1. 取消事务,放弃执行事务块内的所有命令。
  2. 如果正在使用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
  1. 监视一个(或多个) key
  2. 如果在事务执行之前这个(或这些) 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
  1. 取消WATCH命令对所有key的监视。
  2. 如果在执行WATCH命令之后, EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了。

你可能感兴趣的:(Redis详解4.事务)