腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
圈层
工具
MCP广场
文章/答案/技术大牛
搜索
搜索
关闭
发布
Redis 深度历险记
共 27 篇文章
加入清单架
1
Redis系统学习之入门
2
Redis系统学习之Windows安装
3
Redis系统学习之Linux安装
4
Redis系统学习之Redis性能测试工具
5
Redis系统学习之基础知识
6
Redis系统学习之五大基本数据类型(Redis-Key)
7
Redis系统学习之五大基本数据类型(String(字符串))
8
Redis系统学习之五大基本数据类型(List(列表))
9
Redis系统学习之五大基本数据类型(Set(集合))
10
Redis系统学习之五大基本数据类型(Hash(哈希))
11
Redis系统学习之五大基本数据类型(Zset(有序集合))
12
Redis系统学习之三种特殊数据类型(geospatial(地理位置))
13
Redis系统学习之三种特殊数据类型(hyperloglog(基数统计))
14
Redis系统学习之三种特殊数据类型(bitmaps(位图))
15
Redis系统学习之事物
16
Redis系统学习之Java操作RedisAPI(Jedis)
17
Redis系统学习之SpringBoot集成Redis操作API(创建SpringBoot项目)
18
Redis系统学习之SpringBoot集成Redis操作API(集成SpringDataRedis及其分析)
19
Redis系统学习之自定义RedisTemplate
20
Redis系统学习之配置文件解读(非常全)
21
Redis系统学习之持久化(RDB)
22
Redis系统学习之持久化(AOF)
23
Redis系统学习之发布订阅
24
Redis系统学习之主从复制
25
Redis系统学习之哨兵模式
26
Redis系统学习之其他高可用模型
27
Redis系统学习之缓存穿透,缓存击穿,缓存雪崩的概念及其解决方案
清单首页
Redis 深度历险记
文章详情
清单「Redis 深度历险记」 15/27
Redis系统学习之事物
彼岸舞
·人瑞java开发工程师
Redis事物操作
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
开始事物->命令入队->执行事务|取消事物
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
队列中间有命令执行错误
错误包含
编译型错误(代码写的有问题),命令写错了,这个时候所有的命令都不会执行
其中getset k1 是语法错误
运行时错误,不会影响到成功的命令执行结果,不会回滚
对字符串进行累加,属于运行时错误,可以去到k2,只有第一行命令错误,不会影响其他的
Redis事物具有以下特性
一次性
顺序性
排他性
开始事务。
multi
命令入队。
要执行的Redis命令
执行事务。
exec
取消事物
discard
事物取消后无法提交,入队的命令也不会执行
监视(实现乐观锁)
悲观锁
很悲观,认为什么时候都会出问题,无论做什么都加锁
乐观锁
很乐观,认为什么时候都不会出现问题,所以不会加锁,更新数据的时候,判断一下,在此期间是否有人改动过数据
获取version
更新时比较version
watch key[key循环]
事物正常结束,数据期间没有发生变动,这个时候就正常执行成功(就是看你的钱,在你花的期间,有没有人动过)
一但事物执行成功监控就会取消
在链接一个客户端(测试失败)
A线程准备执行事物并监控qian这个key,然后命令入队,但是还没有执行提交
B线程在这个时候对qian这个key的值进行修改
B线程重置成1000
A线程开始提交事物
提交后返回空,因为监控的变量qian被修改过,所以不做任何操作
ok,也相当于事物回滚了
测试会不会有ABA问题
A线程
B线程
A线程
经过测试发现,不会存在ABA问题
取消监视
unwatch
取消全部的监视
经过测试多个进程取消监视不会影响其他已开启事物的监视
A线程
B线程
A线程
返回结果为空,所以监视并没有被取消
Redis事物详解(来自小姐姐的面试题71)
A原子性:命令要么一起执行,要么一起不执行,没有mysql的rollback
C一致性:执行到一半可恢复
I持久性:RDB和AOF两个持久化机制
D隔离性:redis是单线程,没有mysql中可见性的问题
事务开始:执行MULTI命令,标志着事务的开始,该命令会将客户端状态的flags属性中的REDIS_MULTI标示打开
命令入队:当客户端切换到事务状态后,服务器会根据这个客户端发来的命令执行不同的操作:
如果发送命令为MULTI(事务开始)、EXEC(事务执行)、WATCH(监控key值)、DISCARD(结束事务)命令中的一个,则立即执行
如果是其他命令,则不执行。先检查命令是否正确,无语法错误,如不正确,服务器会在客户端状态redisClient的flags属性关闭;如果正确,将这个命令放入一个事务队列,并向客户端返回QUEUED回复
事务队列按照FIFO(先进先出)的方式保存入队的命令
事务执行:客户端发送EXEC命令,服务器执行事务。
客户端状态flags属性不包含REDIS_MULTI标示,或包含REDIS_DIRTY_CAS或REDIS_DIRTY_EXEC标示,直接取消事务执行
flags中有REDIS_MULTI标示,无xxxCAS或xxxEXEC标示,服务器会遍历客户端的事务队列,并执行事务队列中的所有命令,将返回结果全部返回给客户端
redis不支持事务回滚机制,但会检查每一个事务命令是否有语法错误;redis事务不支持检查程序员的逻辑错误,如对String类型对数据库执行hashMap类型的操作
WATCH命令:乐观锁,可以为redis事务提供check-and-set(CAS)行为。可以监控一个或多个键,一旦其中一个键被修改或删除,之后的事务就不会执行,监控一直延续到EXEC命令。可在MULTI命令之前或其执行中。
MULTI命令:用于开启事务,返回永远是ok。客户端可以继续向服务器发送任意多条命令,不会执行,放入命令队列,当EXEC命令被调用时,所有队列中的命令先进先执行
EXEC命令:执行所有事务块内的命令,返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值null
DISCARD命令:清空事务队列,并放弃执行事务,客户端会从事务状态中退出
UNWATCH命令:取消watch对所有key的监控
作者:彼岸舞
时间:2021\05\05
内容关于:Redis
本文属于作者原创,未经允许,禁止转发
下一篇
举报
领券