使用Redis 管理事务(Java)

栏目: 数据库 · 发布时间: 4年前

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

前言

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, RMapCacheLocalCachedMapRSETRSetCacheRBucket

支持的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(); 
    }
    @PreDestroy
    public 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的更多使用:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

互联网寡头战争

互联网寡头战争

屈运栩 / 浙江大学出版社 / 2017-5-1 / CNY 49.00

本书意在复盘2015年下半年资本寒冬袭来之后,互联网行业发生的小巨头并购等连锁反应,揭示其背后推手——以BAT(百度、阿里巴巴、腾讯)为首的互联网巨头在零售、出行、本地生活、金融等行业的布局竞争,记录和呈现行业新贵的选择与博弈,深度剖析中国互联网生态的演进过程。一起来看看 《互联网寡头战争》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具