前言:
Redis中的事务容许在一个步骤中执行一组命令。对某些用户来讲,在Java上管理Redis事务可能会很是棘手,但若是您拥有合适的工具,则会更容易。 此篇会介绍在Java上执行Redis事务的全部知识,以及对Spring事务管理器和Redis的XA事务的简要介绍。html
Java上的Redis事务
Redis事务是原子的,这意味着要么处理事务中的全部命令,要么都不处理。这些命令做为单个隔离操做顺序执行,在执行事务的过程当中没有选择由另外一个客户端发出的请求。java
Redis事务基于四个命令:MULTI,EXEC,DISCARD和WATCH。 MULTI命令容许用户发出多个命令,这些命令所有在用户调用EXEC时执行。即便多个命令列表中的命令失败,仍将处理队列中的全部其余命令。若是发生这种状况,用户将看到错误消息。redis
Redisson是一个Redis Java客户端,它容许咱们在隔离级别上执行Java上的事务 READ_COMMITTED
。参与Java事务对象的一些例子是RMap,RMapCache,LocalCachedMap,RSET,RSetCache和RBucket。spring
支持的Redis模式是:数据库
SINGLEapi
MASTER/SLAVE服务器
SENTINELoracle
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中的事务。
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的更多使用: