Redis 事务
2017-09-15 11:49
323 查看
事务相关命令
MULTI
自1.2.0可用。**时间复杂度:**O(1)。
语法:[b]MULTI[/b]
说明:
标记一个事务块的开始。
事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由
EXEC命令原子性(atomic)地执行。
返回值:
总是返回
OK。
示例:
# 下面命令在 客户端1 中执行 coderknock> MULTI OK coderknock> SET testMULTI 0 QUEUED coderknock> INCR testMULTI QUEUED coderknock> INCR testMULTI QUEUED coderknock> INCR testMULTI QUEUED # 这个时候从另一个 客户端(我们称呼为客户端2) 执行以下: coderknock> GET testMULTI (nil) # 此时我们可以看到 客户端1 的命令还没有执行 # 下面切换到 客户端1 执行 EXEC coderknock> EXEC 1) OK 2) (integer) 1 3) (integer) 2 4) (integer) 3 # 此时在 客户端2 中就可以访问到 该数据了 coderknock> GET testMULTI "3"
#### DISCARD
自2.0.0可用。
**时间复杂度:**O(1)。
语法:[b]DISCARD[/b]
说明:
取消事务,放弃执行事务块内的所有命令。
如果正在使用
WATCH命令监视某个(或某些) key,那么取消所有监视,等同于执行命令
UNWATCH。
返回值:
总是返回
OK。
示例:
# 当没有事务开启时 coderknock> DISCARD (error) ERR DISCARD without MULTI coderknock> MULTI OK # ping 用来查询状态 测试该客户端处于队列状态(开启事务时命令只是装入队列并不会执行) coderknock> PING QUEUED coderknock> SET testDISCARD (error) ERR wrong number of arguments for 'set' command coderknock> SET testDISCARD a QUEUED # 退出事务 coderknock> DISCARD OK # 状态恢复正常状态 coderknock> PING PONG # 事务中的命令没有执行 coderknock> GET testDISCARD (nil)
#### WATCH
自2.2.0可用。
**时间复杂度:**O(1)。
语法:[b]WATCH key [key …][/b]
说明:
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
返回值:
总是返回
OK。
示例:
在之后的
EXEC命令中会详细介绍。
UNWATCH
自2.2.0可用。**时间复杂度:**O(1)。
语法:[b]UNWATCH[/b]
说明:
取消
WATCH命令对所有 key 的监视。
如果在执行
WATCH命令之后,
EXEC命令或
DISCARD命令先被执行了的话,那么就不需要再执行
UNWATCH了。
因为
EXEC命令会执行事务,因此
WATCH命令的效果已经产生了;而
DISCARD命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行
UNWATCH了。
返回值:
总是返回
OK。
示例:
在之后的
EXEC命令中会详细介绍。
EXEC
自1.2.0可用。时间复杂度:事务块内所有命令的时间复杂度的总和。
语法:[b]DISCARD[/b]
说明:
执行所有事务块内的命令。
假如某个(或某些) key 正处于
WATCH命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么
EXEC命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。
返回值:
事务块内所有命令的返回值,按命令执行的先后顺序排列。
当操作被打断时,返回空值
nil。
示例:
# 在 MULTI 命令的实例中我们演示了事务正常执行的情况 # 客户端1 # 使用 WATCH 监视 key 且正常执行成功 coderknock> WATCH testWATCH OK coderknock> MULTI OK coderknock> SET testWATCH 2123 QUEUED coderknock> EXEC 1) OK # 使用 WATCH 监视 key 且未正常执行 coderknock> WATCH testWATCH OK coderknock> SET testWATCH a OK coderknock> GET test WATCH (error) ERR wrong number of arguments for 'get' command coderknock> GET testWATCH "a" coderknock> DEL testWATCH (integer) 1 coderknock> MUTLI (error) ERR unknown command 'MUTLI' coderknock> MULTI OK coderknock> SET testWATCH a QUEUED coderknock> SET testWATCH ccc QUEUED # 客户端2 coderknock> SET testWATCH abc OK # 客户端1 coderknock> EXEC (nil) coderknock> GET testWATCH "abc" # 只要有在 WATCH 之后在非事务中对 key 有操作就不可以,无论是你哪个客户端 coderknock> WATCH testWATCH OK coderknock> SET testWATCH a OK coderknock> MULTI OK coderknock> SET testWATCH qwe QUEUED coderknock> EXEC (nil) # 语法错误会造成整个事务无法执行 coderknock> WATCH testWATCH OK coderknock> MULTI OK coderknock> SET testWATCH aaa QUEUED coderknock> EXEC \ (error) ERR unknown command 'EXEC\' coderknock> EXEC (error) EXECABORT Transaction discarded because of previous errors.
事务中错误处理
语法错误会造成整个事务无法执行(示例中 EXEC\ 命令错误)运行时错误:非语法错误,只是使用命令方式不正确比如使用 SADD 操作字符类型等等,只是错误部分报错,其他正常执行,且最后不会回滚事务。
Redis 提供了简单的事务,之所以说它简单,主要是因为它不支持事务中的回滚特性,同时无法实现命令之间的逻辑关系计算,当然也体现了 Redis 的 “keep it simple” 的特性。lt.com/l/1500000010001040)
我是广告
本人 Redis 方面的讲座已经上线快去看看有没有你感兴趣的吧(说不定会有优惠哟~~数量有限要抓紧呀):[Spring Boot + Redis 实现 论坛系统之项目整体规划] (https://segmentfault.com/l/1500000010993497) 10月9日之前有99份优惠名额,有兴趣的同学赶快入手吧
提升职业竞争力的必备知识 Redis 之初识
提升职业竞争力的必备知识 Redis 之高级特性
提升职业竞争力的必备知识 Redis 之缓存与Session共享
提升职业竞争力的必备知识 Redis 之排行榜与附近的人
以上课程现在可以打包购买了 Redis 系列讲座合集
打包购买更实惠
相关文章推荐
- redis中的事务,连接,生存时间,排序相关
- Redis的事务功能详解
- Redis事务
- Redis 事务
- Redis实战(10)高级特性(2)事务与乐观锁
- Redis命令学习-Transaction(事务)
- Redis的事务
- Redis(3)---Redis事务
- Redis事务介绍
- Redis事务
- redis入门--简单事务
- 针对多个Redis key使用事务方式同步修改时引发的问题
- Redis笔记(五)Redis的事务
- redis的事务处理
- redis中事务机制及乐观锁的实现
- Redis教程6--Redis事务
- Redis中的事务
- redis学习笔记 - Pipeline与事务
- 四 redis学习笔记之事务
- Redis学习手册(事务)(转)