使用Spring Boot實現Redis事務 | Vinsguru
大多數redis命令可以歸類到get/set下。預設情況下,所有這些命令都是原子的。但是,當我們需要順序執行一組命令時,則不能保證它是原子的。Redis透過multi,exec和discard命令提供了對事務的支援.
我們首先告訴redis我們將透過呼叫multi命令來執行一組操作。然後我們照常執行操作(A,B和C),如下圖所示。完成後,如果情況良好,我們將呼叫exec(),或者將其丟棄以忽略更改。
我們將考慮一個簡單的Bank應用程式,其中Redis是主要資料庫。我們有一組帳戶。使用者可以將資金從一個帳戶轉移到另一個帳戶。
讓我們看看如何使用Spring Boot將資金轉賬作為Redis交易來實現。
讓我們建立一個簡單的Account類,如下所示。
@Data @AllArgsConstructor(staticName = "of") public class Account implements Serializable { private int userId; private int balance; } |
Redis事務– SessionCallBack:
Spring Data Redis提供了SessionCallBack介面,當我們需要作為一個事務執行多個操作時,需要實現該介面。
- MoneyTransfer是SessionCallBack的實現,其中包含用於匯款的業務邏輯。
- 它將收到帳戶ID和要轉帳的金額。
@AllArgsConstructor(staticName = "of") public class MoneyTransfer implements SessionCallback<List<Object>> { public static final String ACCOUNT = "account"; private final int fromAccountId; private final int toAccountId; private final int amount; @Override public <K, V> List<Object> execute(RedisOperations<K, V> redisOperations) throws DataAccessException { var operations = (RedisTemplate<Object, Object>) redisOperations; var hashOperations = operations.opsForHash(); var fromAccount = (Account) hashOperations.get(ACCOUNT, fromAccountId); var toAccount = (Account) hashOperations.get(ACCOUNT, toAccountId); if(Objects.nonNull(fromAccount) && Objects.nonNull(toAccount) && fromAccount.getBalance() >= amount){ try{ operations.multi(); fromAccount.setBalance(fromAccount.getBalance() - amount); toAccount.setBalance(toAccount.getBalance() + amount); hashOperations.put(ACCOUNT, fromAccountId, fromAccount); hashOperations.put(ACCOUNT, toAccountId, toAccount); return operations.exec(); }catch (Exception e){ operations.discard(); } } return Collections.emptyList(); } } |
測試
我們可以在Redis中新增一些帳戶並測試Redis事務。
@SpringBootApplication public class RedisTransactionApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(RedisTransactionApplication.class, args); } @Autowired private RedisTemplate<Object, Object> redisTemplate; @Override public void run(String... args) throws Exception { // initialize some accounts this.redisTemplate.opsForHash().put(MoneyTransfer.ACCOUNT, 1, Account.of(1, 100)); this.redisTemplate.opsForHash().put(MoneyTransfer.ACCOUNT, 2, Account.of(2, 20)); // do the transaction this.redisTemplate.execute(MoneyTransfer.of(1, 2, 30)); // print the result System.out.println(this.redisTemplate.opsForHash().get(MoneyTransfer.ACCOUNT, 1)); System.out.println(this.redisTemplate.opsForHash().get(MoneyTransfer.ACCOUNT, 2)); } } |
原始碼可在此處獲得。
相關文章
- 使用Spring Boot + Kafka實現Saga分散式事務模式的原始碼 - vinsguruSpring BootKafka分散式模式原始碼
- 使用Spring Boot實現事務管理Spring Boot
- 使用Spring Boot + Redis 進行實時流處理 - vinsguruSpring BootRedis
- 使用Spring Boot實現分散式事務Spring Boot分散式
- Spring boot +mybatis 實現宣告式事務管理Spring BootMyBatis
- spring boot使用Jedis整合Redis實現快取(AOP)Spring BootRedis快取
- Spring Boot的微服務分散聚集模式教程與原始碼 - vinsguruSpring Boot微服務模式原始碼
- Spring事務實現原理Spring
- 【Spring】事務實現原理Spring
- Spring事務專題(四)Spring中事務的使用、抽象機制及模擬Spring事務實現Spring抽象
- Spring Boot Redis 實現分散式鎖,真香!!Spring BootRedis分散式
- spring boot 結合Redis 實現工具類Spring BootRedis
- Spring Boot 整合 Redis 實現快取操作Spring BootRedis快取
- spring boot中redis使用Spring BootRedis
- 如何在Redis中實現事務Redis
- Spring Boot(三):Spring Boot 中 Redis 的使用Spring BootRedis
- 【Redis系列】Spring boot實現監聽Redis key失效事件RedisSpring Boot事件
- Spring Boot系列之使用@Scheduled實現定時任務Spring Boot
- 使用Spring實現反應式事務(Reactive Transactions)SpringReact
- node.js 中使用redis實現分散式事務鎖Node.jsRedis分散式
- Redis 設計與實現 (七)--事務Redis
- 在 Spring Boot 中使用 RedisSpring BootRedis
- 使用Spring Boot實現模組化Spring Boot
- spring微服務實戰(二):使用Spring Boot建立微服務微服務Spring Boot
- 使用SpringBoot實現微服務超時重試模式 - VinsguruSpring Boot微服務模式
- Spring Boot之使用Scheduled註解實現定時任務Springboot
- 使用Docker實現Spring Boot Restful Web服務案例原始碼DockerSpring BootRESTWeb原始碼
- Spring Boot事務發件箱模式Spring Boot模式
- Golang 實現 Redis(8): TCC分散式事務GolangRedis分散式
- 使用Kafka Streams和Spring Boot微服務中的分散式事務 - PiotrKafkaSpring Boot微服務分散式
- 使用Spring Boot實現的GraphQL示例Spring Boot
- 使用Spring Data R2DBC +Postgres實現增刪改查 - vinsguruSpring
- 【Azure Redis 快取】示例使用 redisson-spring-boot-starter 連線/使用 Azure Redis 服務Redis快取Springboot
- Spring Boot整合Redis實戰操作Spring BootRedis
- 使用Spring Boot實現微服務架構的開源專案Spring Boot微服務架構
- Spring Boot中使用斷路器模式實現彈性微服務Spring Boot模式微服務
- Spring Boot整合Hystrix實現服務容錯Spring Boot
- 利用Spring Boot實現微服務的配置中心Spring Boot微服務