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. 链接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

  1. 链接2:直接修改money的值
127.0.0.1:6379> set money 200
OK
  1. 链接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事务的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记——redis事务乐观锁悲观锁

Redis学习笔记4:Redis事务

Redis学习笔记4:Redis事务

Redis学习笔记3--Redis事务

Redis 学习笔记Redis事务

尚硅谷Redis学习笔记-- Redis事务和锁机制