前言:
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的更多使用: