java redis事务机制_Redis 事务机制
Redis 事务:可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序串行化执行而不会被其它命令插入,一次性、顺序性、排他性的执行一系列命令。
一、常用命令
【1】
:开启一个事务
【2】
:执行事务中的命令。可以看到
开始到
之间,所有的命令都会被加入到一个命令队列中。当执行
命令后,将 QUEUED 中所有的命令执行。
【3】
:放弃事务
1 127.0.0.1:6379>multi2 OK3 127.0.0.1:6379> set redis "redis"
4 QUEUED5 127.0.0.1:6379>get redis6 QUEUED7 127.0.0.1:6379> sadd tag "java" "c" "c#"
8 QUEUED9 127.0.0.1:6379>smembers tag10 QUEUED11 127.0.0.1:6379>exec12 1) OK13 2) "redis"
14 3) (integer) 3
15 4) 1) "c#"
16 2) "java"
17 3) "c"
18
19 #放弃执行案例20 127.0.0.1:6379>multi21 OK22 127.0.0.1:6379> set mysql "mysql"
23 QUEUED24 127.0.0.1:6379>get mysql25 QUEUED26 127.0.0.1:6379>discard27 OK28 127.0.0.1:6379>get mysql29 (nil)30 127.0.0.1:6379>
常见的两种状况:①、全体连坐(当语法有错时,一条都不成功)②、冤头债主(当时编译时出错,部分可以成功)
注意事项:Redis 的事务没有提供类似于关系型数据库的回滚(rollback),所以开发人员必须在事务执行失败后进行后续的处理。
每个 Redis 客户端都有自己的事务状态,保存在 multiState 属性中,进一步,每一个事务状态包含一个事务队列以及已入队命令的计数器,事务队列是一个数组,数组中的每个元素保存了已入队命令的相关信息,包含指向命令实现函数的指针、命令的参数,以及参数的数量。
二、WATCH 监控
在 Nosql 数据库中,CAS 是一种保证原子性的操作。Redis 也提供了这样的一个机制,就是利用 Watch命令来实现的。Watch 指令,类似乐观锁(悲观锁:锁整张表。乐观锁:锁一行数据),事务提交时,如果 Key 的值已被别的客户端改变,比如某个 list已被别的客户端 push/pop 过了,整个事务队列都不会被执行,通过 WATCH 命令在事务执行之前监控了多个 Keys,倘若在WATCH 之后有任何 Key 的值发生了变化,EXEC 命令执行的事务都将被放弃,同时返回 Nullmulti-bulk 应答以通知调用者事务执行失败。
【1】客户端1:对 key = redis 的值进行监控,并开启事务后对 key = redis 的数据进行修改。如下:
1 127.0.0.1:6379>watch redis2 OK3 127.0.0.1:6379>multi4 OK5 127.0.0.1:6379> set redis "redis"
6 QUEUED
【2】客户端2:直接对 key = redis 的值进行修改。如下:
1 127.0.0.1:6379> set redis "re"
2 OK
【3】客户端1:执行 EXEC 提交事务,会发现执行失败。当获取 redis 值时,发现是客户2修改的值。
1 127.0.0.1:6379>exec2 (nil)3 127.0.0.1:6379>get redis4 "re"
UNWATCH:取消监控,与 WATCH 命令相反。当指向提交事务EXEC 或取消事务DISCARD 时,会自动执行 UNWATCH 取消客户端对某 key 的监控
三、小结
3 阶段:【1】开启:以MULTI开始一个事务
【2】入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
【3】执行:由EXEC命令触发事务
3 特性:【1】单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
【2】没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在 ”事务内的查询要看到事务里的更新,在事务外查询不能看到” 这个让人万分头痛的问题。
【3】不保证原子性:redis 同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
java redis事务机制_Redis 事务机制相关推荐
- java redis 主从 哨兵_Redis主从复制与哨兵机制
Redis主从复制 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数 ...
- 事务例子_Redis事务系列之一Redis事务详解
一.前言 本章是redis事务系列知识第一章,redis事务系列主要讲解以下内容: redis 事务 redis乐观锁讲解 redis乐观锁实现秒杀 我们一步一步来,本章主要讲解事务. 二.事务 2. ...
- redis 硬件要求_Redis持久化机制
介绍 Redis所有的数据都保存在内存中,数据的更新将异步的保存到硬盘上,当需要恢复数据时,从硬盘上将数据再读取到内存中,这就是Redis的持久化过程.主流的持久化方式有两种: 快照:MySQL的Du ...
- java redis释放连接_redis在应用中使用连接不释放问题解决
今天测试,发现redis使用的时候,调用的链接一直不释放.后查阅蛮多资料,才发现一个配置导致的.并不是他们说的服务没有启动导致的. 1)配置文件 #redis连接配置================= ...
- java redis 主从配置_Redis实现主从复制(MasterSlave)
Redis实现主从复制(Master&Slave) Redis主从复制 1.是什么 1.单机有什么问题: 单机故障 容量瓶颈 qps瓶颈 主机数据更新后根据配置和策略,自动同步到备机的mast ...
- mysql哨兵机制_Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了
前面我们基于实际案例搭建了缓存高可用方案(分布式缓存高可用方案,我们都是这么干的)同时提到了redis主从架构下是如何保证高可用的,讲到了它是通过redis sentinel的机制来实现的. 今天我们 ...
- java redis 网络断开_Redis长时间连接后自动断开
从日志看2小时 [DEBUG] 22:02:48.206 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:151) - Get 'emailAlertService' ...
- java redis工具类_redis Java工具类详解
redis 工具 [Java]代码 private static ShardedJedisPool sharedJedisPool; public synchronized static void i ...
- java redis缓存使用_redis缓存在项目中的使用
关于redis为什么能作为缓存这个问题我们就不说了,直接来说一下redis缓存到底如何在项目中使用吧: 1.redis缓存如何在项目中配置? 1.1redis缓存单机版和集群版配置?(redis的客户 ...
最新文章
- 如何在空硬盘Linux系统,Linux系统如何新增一块硬盘
- iOS友盟推送发送失败
- 网易云信又双叒受到Gartner关注,看看这次的报告说了什么?
- python之路-day18-反射
- js(Dom+Bom)第五天(1)
- 吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码
- 【开发者笔记】java 利用jna调用c#的dll
- LeetCode 404. 左叶子之和
- 三年级计算机教案 渔舟唱晚,《渔舟唱晚》大班教案
- Linux运维问题解决(4)——linux LVM技术 逻辑卷增加 扩容 缩小 删除等操作
- 提前俯瞰应用变现行业前景,抢占未来先机
- Ansible详解(十四)——Ansible Role实战
- Azure SQL作業
- yolov7调用大华工业相机进行识别
- 笔记1——海康威视摄像头关闭声音
- 渲染到纹理(Render To Texture, RTT)
- java代码如何整合_Java如何合并两个PPT文档?
- 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)
- 宝藏级的开源小程序(APP)商城-CRMEB-WEB版实测
- 运动控制卡讲解及实例应用