redis的事务和watch机制

这里写目录标题

第一章、redis事务和watch机制

1.1)redis事务,事务的三大命令

什么是redis事务

Redis 中的事务(transaction)是一个单独隔离的操作,保证两个或两个以上的命令集合按需排队并顺序执行,中间不会被任何其他操作打断。
redis事务其实是指运用事务的思想实现一组集合命令的执行,没有回滚的概念,严格意义上没有事务。

①multi - setAutoCommoit(false)-事务开启

语法:开启事务 multi

作用:标记一个事务的开始。通过multi,后续的命令都会按照先后顺序被放进一个队列当中。当用户键入exec后,这些指令都会按顺序执行。

返回值:总是返回 ok

②exec -执行

语法:执行事务 exec

作用:执行所有事务块内的命令

返回值:事务内的所有执行语句内容,事务被打断(影响)返回 nil

③discard -取消

语法:取消事务 discard

作用:取消事务,如果开启multi后输入若干命令,再键入discard,则之前的命令令通通取消执行。

返回值:总是返回 ok

java 复制代码
# 开启事务
127.0.0.1:6379> MULTI
OK
# 输入两个或者两个以上命令
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
# 执行命令
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

1.2)redis事务的错误和回滚的情况

①组队时出错,错误对于redis来说是已知的,事务中的所有指令都会失效。

java 复制代码
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k33
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
(empty array)

②运行时出错:因为错误是未知的,所以redis必须执行时才能知道错误,而redis无错误回滚机制,会继续执行后续指令并有效。

java 复制代码
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> INCR k1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379>

1.3)watch机制

①watch 监视某个或者某几个key的值,如果有 key 的 value 值在事务 EXEC 执行之前被修改了,那么事务将被打断。
返回值:总是返回 ok

语法:watch key [key ...]

②取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了
返回值:总是返回 ok

语法:unwatch

③例子

启动服务器redis-server , 再开启两个客户端连接。 分别叫 A 客户端 (红色)和 B 客户端(黄色)。

1)在 A 客户端设置 key : str.lp 登录人数为 10

2)在 A 客户端监视 key : str.lp

3)在 A 客户端开启事务 multi

4)在 A 客户端修改 str.lp 的值为 11

5)在 B 客户端修改 str.lp 的值为 15

6)在 A 客户端执行事务 exec

7)在 A 客户端查看 str.lp 值,A 客户端执行的事务没有提交,因为 WATCH 的 str.lp 的值已经被修改了, 所以放弃了事务。

相关推荐
indexsunny10 小时前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
摇滚侠16 小时前
阿里云安装的 Redis 在什么位置,如何找到 Redis 的安装位置
redis·阿里云·云计算
啦啦啦_999916 小时前
Redis-2-queryFormat()方法
数据库·redis·缓存
forestsea19 小时前
深入理解Redisson RLocalCachedMap:本地缓存过期策略全解析
redis·缓存·redisson
佛祖让我来巡山19 小时前
Redis 为什么这么快?——「极速快递站」的故事
redis·redis为什么快?
啦啦啦_999921 小时前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学21 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
fengxin_rou21 小时前
[Redis从零到精通|第四篇]:缓存穿透、雪崩、击穿
java·redis·缓存·mybatis·idea·多线程
是阿楷啊1 天前
Java大厂面试场景:音视频场景中的Spring Boot与微服务实战
spring boot·redis·spring cloud·微服务·grafana·prometheus·java面试
笨蛋不要掉眼泪1 天前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap