前言 :
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(); } @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的更多使用: