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

相关推荐
精进攻城狮@31 分钟前
Redis(value的数据类型)
数据库·redis
jwybobo20072 小时前
redis7.x源码分析:(3) dict字典
linux·redis
simpleGq2 小时前
Redis知识点整理 - 脑图
数据库·redis·缓存
李少兄3 小时前
解决Spring Boot整合Redis时的连接问题
spring boot·redis·后端
日里安3 小时前
8. 基于 Redis 实现限流
数据库·redis·缓存
sam-12312 小时前
k8s上部署redis高可用集群
redis·docker·k8s
看山还是山,看水还是。13 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
谷新龙00113 小时前
Redis运行时的10大重要指标
数据库·redis·缓存
精进攻城狮@13 小时前
Redis缓存雪崩、缓存击穿、缓存穿透
数据库·redis·缓存
avenue轩18 小时前
gdb调试redis。sudo
c++·redis