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 事务机制相关推荐

  1. java redis 主从 哨兵_Redis主从复制与哨兵机制

    Redis主从复制 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数 ...

  2. 事务例子_Redis事务系列之一Redis事务详解

    一.前言 本章是redis事务系列知识第一章,redis事务系列主要讲解以下内容: redis 事务 redis乐观锁讲解 redis乐观锁实现秒杀 我们一步一步来,本章主要讲解事务. 二.事务 2. ...

  3. redis 硬件要求_Redis持久化机制

    介绍 Redis所有的数据都保存在内存中,数据的更新将异步的保存到硬盘上,当需要恢复数据时,从硬盘上将数据再读取到内存中,这就是Redis的持久化过程.主流的持久化方式有两种: 快照:MySQL的Du ...

  4. java redis释放连接_redis在应用中使用连接不释放问题解决

    今天测试,发现redis使用的时候,调用的链接一直不释放.后查阅蛮多资料,才发现一个配置导致的.并不是他们说的服务没有启动导致的. 1)配置文件 #redis连接配置================= ...

  5. java redis 主从配置_Redis实现主从复制(MasterSlave)

    Redis实现主从复制(Master&Slave) Redis主从复制 1.是什么 1.单机有什么问题: 单机故障 容量瓶颈 qps瓶颈 主机数据更新后根据配置和策略,自动同步到备机的mast ...

  6. mysql哨兵机制_Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了

    前面我们基于实际案例搭建了缓存高可用方案(分布式缓存高可用方案,我们都是这么干的)同时提到了redis主从架构下是如何保证高可用的,讲到了它是通过redis sentinel的机制来实现的. 今天我们 ...

  7. java redis 网络断开_Redis长时间连接后自动断开

    从日志看2小时 [DEBUG] 22:02:48.206 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:151) - Get 'emailAlertService' ...

  8. java redis工具类_redis Java工具类详解

    redis 工具 [Java]代码 private static ShardedJedisPool sharedJedisPool; public synchronized static void i ...

  9. java redis缓存使用_redis缓存在项目中的使用

    关于redis为什么能作为缓存这个问题我们就不说了,直接来说一下redis缓存到底如何在项目中使用吧: 1.redis缓存如何在项目中配置? 1.1redis缓存单机版和集群版配置?(redis的客户 ...

最新文章

  1. 如何在空硬盘Linux系统,Linux系统如何新增一块硬盘
  2. iOS友盟推送发送失败
  3. 网易云信又双叒受到Gartner关注,看看这次的报告说了什么?
  4. python之路-day18-反射
  5. js(Dom+Bom)第五天(1)
  6. 吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码
  7. 【开发者笔记】java 利用jna调用c#的dll
  8. LeetCode 404. 左叶子之和
  9. 三年级计算机教案 渔舟唱晚,《渔舟唱晚》大班教案
  10. Linux运维问题解决(4)——linux LVM技术 逻辑卷增加 扩容 缩小 删除等操作
  11. 提前俯瞰应用变现行业前景,抢占未来先机
  12. Ansible详解(十四)——Ansible Role实战
  13. Azure SQL作業
  14. yolov7调用大华工业相机进行识别
  15. 笔记1——海康威视摄像头关闭声音
  16. 渲染到纹理(Render To Texture, RTT)
  17. java代码如何整合_Java如何合并两个PPT文档?
  18. 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)
  19. 宝藏级的开源小程序(APP)商城-CRMEB-WEB版实测
  20. 运动控制卡讲解及实例应用

热门文章

  1. Python读取hdf文件并转化为tiff格式输出
  2. 机器学习集成学习算法
  3. 用VB6.0编报表工资条的软件,结果失败。用EXCEL做反而更好。
  4. OSChina 周二乱弹 ——永远不要得罪一只猫
  5. 评论:微博与中国版SNS的未来
  6. 溯源(三)之Linux-入侵排查
  7. JS使用正则实现不区分字母大小写的高亮效果(不改变原文本的大小写)
  8. bentoml部署深度学习模型(一)
  9. CPSE安博会 | 江波龙邀您共探智慧安防,赋能存储未来
  10. react中使用i18n中英文转换