SpringBoot之Redis(三)——Redis事务机制

  • 1. Redis 事务执行过程
  • 2. 开启事务支持
  • 3. 测试
  • 4. 测试结果说明
  • 5. 源码下载

1. Redis 事务执行过程

Redis 事务执行过程如下图所示:

2. 开启事务支持

RedisConfig.java文件EnbaleTransactionSupport设为true

@Beanpublic RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory ) {//设置序列化Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// 配置redisTemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(jedisConnectionFactory);RedisSerializer stringSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringSerializer); // key序列化redisTemplate.setValueSerializer(stringSerializer); // value序列化redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化redisTemplate.setHashValueSerializer(stringSerializer); // Hash value序列化redisTemplate.afterPropertiesSet();//开启事务支持redisTemplate.setEnableTransactionSupport(true);return redisTemplate;}

3. 测试

使用@Transactional:

@RequestMapping("/testTransactiont")@Transactionalpublic Map<String, Object> testTransactiont() {redisTemplate.opsForValue().set("key1", "v1");//设置要监控的key1redisTemplate.watch("key1");//开始事务,在exec命令执行前,全部只是进入队列redisTemplate.multi();redisTemplate.opsForValue().set("key2", "v2");//redisTemplate.opsForValue().increment("key1",1); //①//v2值应为nullObject v2 = redisTemplate.opsForValue().get("key2");System.out.println("命令在队列,所以v2为:" + v2);redisTemplate.opsForValue().set("key3", "v3");Object v3 = redisTemplate.opsForValue().get("key3");System.out.println("命令在队列,所以v3为:" + v3);//执行exec(),将先判别key1是否在监控后修改过,如果是则不执行事务,否则执行事务redisTemplate.exec();//②Map<String, Object> map = new HashMap<String, Object>();map.put("success", true);return map;}

4. 测试结果说明

为了揭示Redis 事务的特性,我们对这段代码做以下两种测试。

  1. 先在Redis客户端清空key2 和key3两个键的数据,然后在②处设置断点,在调试的环境下让请求达到断点,此时在Redis上修改key1的值,然后再跳过断点,在请求完成后在Redis上查询key2和key3值,可以发现key2 、key3 返回的值都为空,因为程序中先使得Redis的watch 命令监控了key1的值,而后的multi让之后的命令进入队列,而在exec方法运行前我们修改了key1,根据Redis事务的规则,它在exec方法后会探测key1是否被修改过,如果没有则会执行事务,否则就取消事务,所以key2 和key3没有被保存到Redis服务器中。
  2. 继续把key2和key3两个值清空,把①处的注释取消,让代码可以运行,因为key1 是一个字符串,所以这里的代码是对字符串加1,这显然是不能运算的。同样地,我们运行这段代码后,可以看到服务器抛出了异常,然后我们去Redis服务器查询key2和key3,可以看到它们已经有了值。注意,这就是Redis事务和数据库事务的不一样,对于Redis事务是先让命令进入队列,所以一开始它并没有检测这个加一命令是否能够成功,只有在exec命令执行的时候,才能发现错误,对于出错的命令Redis只是报出错误,而错误后面的命令依旧被执行,所以key2和key3都存在数据,这就是Redis事务的特点,也是使用Redis事务需要特别注意的地方。为了克服这个问题, 一般我们要在执行Redis 事务前,严格地检查数据,以避免这样的情况发生。

5. 源码下载

源码下载地址:https://download.csdn.net/download/huangjun0210/10802867

16-SpringBoot之Redis(三)——Redis事务机制相关推荐

  1. 【Redis】回顾Redis知识点之事务机制

    回顾Redis知识点之事务机制 Redis事务机制 为什么 Redis 不支持回滚(roll back) 假如事务执行一半的时候Redis宕机怎么办? 为什么需要内存回收? 上一篇回顾下Redis基础 ...

  2. 你不知道的redis三-Redis的持久化机制

    目录 一.持久化 二.RDB持久化方式 2.1 手动触发 2.2 RDB持久化命令 2.3 恢复和异常流程演示 2.4 RDB持久化的优缺点 三.AOF持久化 3.1 AOF持久化原理 3.2 AOF ...

  3. Redis(三) -- redis简介、各数据类型应用

    1. 与memcached的区别: Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memcache还可用于缓存其他东西,例如图片.视频等等: Redis不仅仅支持简单的k/v ...

  4. 【承】Redis 原理篇——关于 Redis 中的事务

    前言 关于 Redis 的"起承转合",我前面已经用五个篇章的长度作了一个 Redis 基础篇--"起"篇的详细阐述,相信大家无论之前有没有接触过 Redis, ...

  5. SpringBoot笔记(三)Redis

    在前面我们学习了MySQL数据库,它是一种传统的关系型数据库,我们可以使用MySQL来更好地管理和组织我们的数据,虽然在小型Web应用下,只需要一个MySQL+Mybatis自带的缓存系统就可以胜任大 ...

  6. 图解Redis事务机制

    来自:Java中文社群 作为关系型数据库中一项非常重要的基础功能--事务,在 Redis 中是如何处理并使用的? 1.前言 事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只 ...

  7. Redis教程–事务机制基本介绍

    摘要:Redis是一个简单.高效的内存数据存储,支持多种数据结构.当然,有数据操作的地方往往都少不了事务性,Redis是否支持呢?答案是肯定的.本文将详细讲述如何redis事务使用相关的内,如有错误, ...

  8. Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现

    回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis驱 ...

  9. Redis事务机制 -Redis 核心技术与实战

    事务是数据库的一个重要功能.所谓的事务,就是指对数据进行读写的一系列操作.事务在执行时,会提供专门的属性保证,包括` 原子性(Atomicity) 一致性(Consistency) 隔离性(Isola ...

最新文章

  1. 动态内存检测工具Valgrind
  2. 【Codeforces】427B Prison Transfer(别让罪犯跑了...)
  3. u-boot移植:解决 Retry count exceeded; starting again
  4. Knockout应用开发指南 第八章:简单应用举例(1)
  5. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
  6. 李开复:AI能在15年内取代40%~50%岗位
  7. 织梦ajax加载文章列表,织梦dedecms首页列表页ajax点击下拉加载更多文章瀑布流效果...
  8. ribbon 配置 动态更新_Netflix开源工具:在SpringBoot实现动态路由
  9. 关于DHCP的中继问题
  10. matlab产生pn序列,[求助]PN序列的产生
  11. Studio 3T无限试用
  12. windows下安装kali linux子系统详细教程
  13. 开源中国众包平台的个人空间 工作日志 正文 关于你对软件众包的误解,你真的错了。
  14. javascript 中 caller 与 callee 的作用以及用法
  15. 新版jadx-gui导入dex会提示Bad checksum
  16. Laravel 6 结合网易/阿里邮箱基本邮件发送功能使用
  17. 小程序列表多个批量倒计时
  18. iframe嵌入网页的用法
  19. 基于Jetson AGX Xavier GMSL9296硬件设计与软硬件调试
  20. 【细节呈现】用Python编写2048游戏(命令行版)

热门文章

  1. 语义分割数据集转目标检测数据集
  2. 大气欧美彩色手绘风论文答辩PPT模板
  3. 互联网会成为人类的敌人么?
  4. android 定位 策略
  5. haxe使用enum
  6. 小米物联网世界第一_世界最大物联网?小米牵手宜家布局AloT,却因它栽了大跟头?...
  7. 对抽象函数求导_抽象函数的求导方法怎么?
  8. 2011年亚信联创公用研发中心AIUEGroup大史记
  9. Moviepy输出视频MP4文件Windows媒体播放器播放无画面只有声音问题的解决办法
  10. js条件控制语句最佳实践