前言

Redis中的事务允许在一个步骤中执行一组命令。对某些用户来说,在Java上管理Redis事务可能会非常棘手,但如果您拥有合适的工具,则会更容易。 此篇会介绍在Java上执行Redis事务的所有知识,以及对Spring事务管理器和Redis的XA事务的简要介绍。

Java上的Redis事务

Redis事务是原子的,这意味着要么处理事务中的所有命令,要么都不处理。这些命令作为单个隔离操作顺序执行,在执行事务的过程中没有选择由另一个客户端发出的请求。

Redis事务基于四个命令:MULTI,EXEC,DISCARD和WATCH。 MULTI命令允许用户发出多个命令,这些命令全部在用户调用EXEC时执行。即使多个命令列表中的命令失败,仍将处理队列中的所有其他命令。如果发生这种情况,用户将看到错误消息。

Redisson是一个Redis Java客户端,它允许我们在隔离级别上执行Java上的事务 READ_COMMITTED。参与Java事务对象的一些例子是RMap,RMapCache,LocalCachedMap,RSET,RSetCache和RBucket。

支持的Redis模式是:

  • SINGLE

  • MASTER/SLAVE

  • SENTINEL

  • ELASTICACHE REPLICATED

  • AZURE CACHE

  • RLEC

在创建事务的时候可以提供多种选项。这些包括:

TransactionOptions options = TransactionOptions.defaults()
//参与事务的Redis主服务器与其从服务器之间的同步数据超时。
//默认值为5000毫秒
options.syncSlavesTimeout(5, TimeUnit.SECONDS);
//响应超时
//默认值为3000毫秒
options.responseTimeout(3, TimeUnit.SECONDS);
//定义每次尝试发送事务的时间间隔(如果尚未发送)。
//默认值为1500毫秒
options.retryInterval(2, TimeUnit.SECONDS)//定义发送事务的尝试次数(如果尚未发送)。
//默认为3次尝试
options.retryAttempts(3)
//如果事务尚未在超时内提交,它将自动回滚。
//默认值为5000毫秒
options.timeout(5, TimeUnit.SECONDS);复制代码

Redis的Spring事务管理器

Redisson通过与Spring实现 org.springframework.transaction.PlatformTransactionManager

1.配置 RedissonTransactionContextConfig

@Configuration
@EnableTransactionManagementpublic
public class RedissonTransactionContextConfig {@Bean public TransactionalBean transactionBean() {return new TransactionalBean(); } @Bean public RedissonTransactionManager transactionManager(RedissonClient redisson) { return new RedissonTransactionManager(redisson); } @Bean public RedissonClient redisson() { return BaseTest.createInstance(); }@PreDestroypublic void destroy() { redisson().shutdown(); }
}
public class TransactionalBean { @Autowired private RedissonTransactionManager transactionManager; @Transactional public void commitData() { RTransaction transaction = transactionManager.getCurrentTransaction(); RMap map = transaction.getMap("test1"); map.put("1", "2"); }
}复制代码

然后就可以使用Spring Transaction Manager来管理Redis中的事务。

Redis中的XA事务

Redisson还提供XAResource实现。这允许JTA事务的参与执行分布式事务处理。

XA是双向的系统接口,分布式事务是由一个一个应用程序(Application Program)、一个事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁。事务管理器控制着JTA事务,管理事务生命周期,并协调资源。

JTA中,事务管理器抽象为javax.transaction.TransactionManager接口,并通过底层事务服务(即JTS)实现。资源管理器负责控制和管理实际资源(如数据库或JMS队列)。

以下是Redisson执行XA Transactions的示例:

// 从JTA兼容事务管理器获取的事务
Transaction globalTransaction = transactionManager.getTransaction();
RXAResource xaResource = redisson.getXAResource();
globalTransaction.enlistResource(xaResource);
RTransaction transaction = xaResource.getTransaction();
RBucket<String> bucket = transaction.getBucket("myBucket");
bucket.set("simple");
RMap<String, String> map = transaction.getMap("myMap");
map.put("myKey", "myValue");
transactionManager.commit();复制代码

可参考redission的更多使用:

  • blog.csdn.net/u011663149/…
  • blog.csdn.net/u011663149/…
  • blog.csdn.net/u011663149/…

转载于:https://juejin.im/post/5cf7298ce51d45775d516f43

使用Redis 管理事务(Java)相关推荐

  1. JAVA Spring 事务管理事务不回滚问题

    Spring事务管理事务不回滚 dao层: @Repository public class UserDaoImpl implements UserDao { @Autowired private J ...

  2. redis插件连接集群 shiro_Shiro经过Redis管理会话实现集群(转载)

    写在前面 1.在上一篇帖子 Shiro一些补充 中提到过Shiro可以使用Shiro自己的Session或者自定义的Session来代替HttpSession 2.Redis/Jedis参考我写的 h ...

  3. SpringBoot、Redis轻松实现Java高并发秒杀系统笔记

    秒杀项目 优极限[完整项目实战]半天带你用SpringBoot.Redis轻松实现Java高并发秒杀系统 文章目录 秒杀项目 技术栈 课程介绍 学习目标 如何设计一个秒杀系统 项目搭建 分布式会话 登 ...

  4. Redis的事务:相关命令 watch 与mysql事务的区别

    Redis事务的概念: Redis 事务的本质是一组命令的集合. 事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不 ...

  5. Redis 实用技术——事务

    引言 redis的事务不像关系型数据库的事务那样完整. "快"是redis的特征,在事务管理的过程中,使用muti命令开启事务块,当输入多条命令后,再使用exec命令执行事务块中的 ...

  6. (转)使用Spring注解方式管理事务与传播行为详解

    http://blog.csdn.net/yerenyuan_pku/article/details/52885041 使用Spring注解方式管理事务 前面讲解了怎么使用@Transactional ...

  7. Spring-Session基于Redis管理Session

    2019独角兽企业重金招聘Python工程师标准>>> 系列文章 Nginx+Tomcat关于Session的管理 Tomcat Session管理分析 Spring-Session ...

  8. springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录)

     源码获取:我的博客资源页面可以下载!!!! 项目名称 springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录) 系统介绍 快递代拿系统 > 该项目使用当前最为流行的 ...

  9. Redis基本事务的操作

    大家好,今天分享一下Redis基本事务的操作 redis的单个命令是保证原子性,(就是要么一起成功,要么一起失败的) redis 事务的本质是一组命令的集合,事务支持一次可以执行多个命令,一个事务当中 ...

最新文章

  1. 2022-2028年中国丙烯酸酯橡胶行业市场深度分析及投资前景分析报告
  2. USACO 1.4 Packing Rectangles
  3. ActivityLifecycleCallbacks
  4. 从外到内提高SQL Server数据库性能
  5. Linux编程练习 --多线程1--线程创建
  6. SAS笔记(2) RETAIN语句
  7. ARTS打卡计划第6周-REVIEW-超越编码的避免项目失败的软技能
  8. mysql ha_err_key_not_found_mysql主从同步报错:Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND...
  9. IJCAI阿里论文 | JUMP: 一种点击和停留时长的协同预估器...
  10. shiro执行多个过滤器_Shiro 实战(四) - 过滤器机制
  11. numeric比较大小 数据库_Liquibase 数据库版本管理工具:3. changeSet 变更集详解
  12. Oracle数据泵对已经存在的表加载索引
  13. 一个简单的堆栈,逻辑很清晰
  14. 国内外GIS基础软件对比分析优缺特性及实际工作生产应用和成功案例综合评价
  15. 桃李春风一杯酒,江湖夜雨十年灯。—第十一天
  16. 51单片机之系统指令
  17. 使用Javascript的跨浏览器支持的图像偏斜效果
  18. 维特WT931——制作支持ROS的IMU惯性导航传感器
  19. Meth | git 常用命令
  20. Hololens远程视频通话与AR标注

热门文章

  1. 通讯接口:I2C和USART,SPI,CAN,USB2.0
  2. 3dsmax 让物体变透明
  3. 如何为Keras中的深度学习模型建立Checkpoint
  4. 服务器查看gpu状态_如何查看服务器gpu
  5. Mac打包Android的apk,[Mac][React Native][Android] 打包成apk
  6. SFTP命令基本使用
  7. nullptr和NULL
  8. java反射类带构造函数_java中反射类的加载和构造函数
  9. Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
  10. 一切皆Socket!