使用Redis 管理事務(Java)

前言

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事務對象的一些例子是RMapRMapCacheLocalCachedMapRSETRSetCacheRBucketspring

支持的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中的事務。

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

相關文章
相關標籤/搜索