Redis 学习笔记Redis事务
Posted Adorable_Rocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 学习笔记Redis事务相关的知识,希望对你有一定的参考价值。
Redis事务:
Redis事务本质:一组命令的集合!一个事务中的所有命令都会被反序列化,在事务执行过程中,会被按照顺序执行!
三大特性:一次性、顺序性、排他性!
如图:队列的顺序性
Redis事务中没有隔离级别的概念!
说明:队列是按照顺序执行的,先添加的先执行
1.multi
127.0.0.1:6379> MULTI # 开启队列
OK
127.0.0.1:6379> set k1 v2
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> exec # 执行队列
1) OK
2) OK
3) OK
4) "v2"
127.0.0.1:6379>
2.discard
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> DISCARD # 放弃队列
OK
127.0.0.1:6379> get k2 # 因为放弃队列后,没有执行队列中的操作,所以获取不到值了
(nil)
127.0.0.1:6379>
3.编译时异常
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> post k1 v1 # 不存在的命令
(error) ERR unknown command 'post'
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
补充:编译时异常导致编译都无法通过,自然在执行队列的时候会发生编译失败错误,因此整个队列都不会被执行。
4.运行时异常
127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379>
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) "v2"
5) OK
127.0.0.1:6379> get k4
"v4"
127.0.0.1:6379>
补充:运行时异常验证的是redis事务不具有原子性,但是单条数据会遵守原子性,换句话说就是队列不会受到来自某条任务执行失败而被中断和回滚
2.监控(WATCH)
-
悲观锁:
很悲观,认为什么时候都会出问题,无论做什么都加锁
-
乐观锁:
很乐观,认为什么时候都不会出问题,所以不会上锁。更新数据的时候去判断一下,在此期间是否有人修改数据。
-
使用Redis的WATCH命令实现乐观锁
1.下面演示基本监控:
- 链接1:执行监控money,添加队列操作
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> WATCH money
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCRBY money 20
QUEUED
- 链接2:直接修改money的值
127.0.0.1:6379> set money 200
OK
- 链接1:再次执行队列操作,返回值为(NIL)
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379>
总结:
1.被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了,那么整个事务都会被取消, EXEC 返回nil来表示事务已经失败。
2.当 EXEC 被调用时, 不管事务是否成功执行, 对所有键的监视都会被取消。
3.我们也可以使用UNWATCH命令手动取消目前对键的监控。
正常流程形式:
127.0.0.1:6379> get money
"200"
127.0.0.1:6379> WATCH money
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCRBY money 300
QUEUED
127.0.0.1:6379> exec
1) (integer) 500
127.0.0.1:6379>
以上是关于Redis 学习笔记Redis事务的主要内容,如果未能解决你的问题,请参考以下文章