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 的值已经被修改了, 所以放弃了事务。

相关推荐
LDM>W<9 小时前
黑马点评-用户登录
java·redis
炫酷的伊莉娜12 小时前
【Redis】零碎知识点(易忘 / 易错)总结回顾
redis
一个天蝎座 白勺 程序猿14 小时前
Python爬虫(29)Python爬虫高阶:动态页面处理与云原生部署全链路实践(Selenium、Scrapy、K8s)
redis·爬虫·python·selenium·scrapy·云原生·k8s
追风赶月、15 小时前
【Redis】哨兵(Sentinel)机制
数据库·redis·sentinel
vvilkim15 小时前
Redis持久化机制详解:保障数据安全的关键策略
数据库·redis·缓存
大数据魔法师16 小时前
Redis(三) - 使用Java操作Redis详解
java·数据库·redis
IT光16 小时前
Redis 五种类型基础操作(redis-cli + Spring Data Redis)
java·数据库·redis·spring·缓存
Uranus^17 小时前
深入解析Spring Boot与Redis集成:高效缓存实践
java·spring boot·redis·缓存
vvilkim17 小时前
Redis 事务与管道:原理、区别与应用实践
数据库·redis·缓存
追风赶月、19 小时前
【Redis】redis用作缓存和分布式锁
redis·分布式·缓存