- vừa được xem lúc

[Redis] - Spring Boot Redis Transaction

0 0 39

Người đăng: TheLight

Theo Viblo Asia

Trong bài viết này chúng ta sẽ tìm hiểu về Redis Transaction.

Nói qua một chút về Database Transaction, nói ngắn gọn đây là một tập hợp của một trong các hành động read/insert/update/delete được thực hiện trong một đơn vị công việc, chúng sẽ thành công tất hoặc các thay đổi sẽ bị loại bỏ trong trường hợp có lỗi xảy ra. Đối với những người từng làm việc với CSDL quan hệ chắc sẽ không xa lạ với khái niệm này. Thế còn đối với CSDL phi quan hệ (NoSQL) Redis thì thế nào? Hầu hết các lệnh redis được thực thi dưới dạng get/set. Các lệnh này mặc định là nguyên tử, lệnh này thực thi không quan tâm đến lệnh khác thực thi thế nào. Nhưng khi chúng ta cần thực hiện một nhóm lệnh theo thứ tự tương tự một tập hợp các hành động như Database Transaction thì nó không được đảm bảo là nguyên tử nữa. Redis cung cấp cơ chế xử lý tương tự database transaction tthông qua các lệnh multi, execdiscard.

Đầu tiên chúng ta nói với redis rằng chúng ta sẽ thực thi một tập hợp các thao tác bằng cách gọi command multi. Sau đó chúng ta thực hiện các thao tác (A, B và C). Sau khi thực hiện xong, chúng ta sẽ gọi command execute nếu không có lỗi xảy ra hoặc gọi lệnh discard để bỏ qua các thay đổi.

Sample Application

Ví dụ chuyển tiền giữa 2 tài khoản ngân hàng sử dụng Redis Transaction.

Class Account đại diện cho tài khoản ngân hàng của người dùng.

@Data
@AllArgsConstructor(staticName = "of")
public class Account implements Serializable { private int userId; private int balance; }

Redis Transaction – SessionCallBack

Spring Data Redis cung cấp interface SessionCallBack, chúng ta cần implement interface này khi chúng ta cần thực hiện nhiều hoạt động như một transaction. MoneyTransfer là một implement của SessionCallBack chứa logic nghiệp vụ để chuyển tiền dựa vào mã tài khoản và số tiền cần chuyển.

@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(); }
}

Main application để test redis transaction.

@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)); }
}

Kết quả:

Account(userId=1, balance=70)
Account(userId=2, balance=50)

Tổng kết

Trên đây là hướng dẫn để mọi người hiểu về cách Spring Redis Transaction hoạt động. Hi vọng bài viết hữu ích với mọi người.

Nguồn: https://thenewstack.wordpress.com/2021/11/24/redis-spring-boot-redis-transaction/

Follow me: thenewstack.wordpress.com

Bình luận

Bài viết tương tự

- vừa được xem lúc

Caching đại pháp 2: Cache thế nào cho hợp lý?

Caching rất dễ. Mình không nói đùa đâu, caching rất là dễ. Ai cũng có thể làm được chỉ sau 10 phút đọc tutorial. Nó cũng giống như việc đứa trẻ lên 3 đã có thể cầm bút để vẽ vậy.

0 0 126

- vừa được xem lúc

Caching đại pháp 1: Nấc thang lên level của developer

Bí quyết thành công trong việc đáp ứng hệ thống triệu user của những công ty lớn (và cả công ty nhỏ). Tại sao caching lại là kỹ thuật tối quan trọng để phù phép ứng dụng rùa bò của chúng ta thành siêu phẩm vạn người mê.

0 0 82

- vừa được xem lúc

Cache dữ liệu Nodejs với Redis

Một tí gọi là lý thuyết để anh em tham khảo. Cache là gì. Lợi ích của việc cache data. .

0 0 111

- vừa được xem lúc

Nguyên tắc hoạt động của redis server

Sự ra đời của Redis. . Câu chuyện bắt đầu khi tác giả của Redis, Salvatore Sanfilippo. (nickname: antirez), cố gắng làm những công việc gần như là không.

0 0 97

- vừa được xem lúc

Viết ứng dụng chat realtime với Laravel, VueJS, Redis và Socket.IO, Laravel Echo

Xin chào tất cả các bạn, đây là một trong những bài post đầu tiên của mình. Sau bao năm toàn đi đọc các blog tích luỹ được chút kiến thức của các cao nhân trên mạng.

0 0 918

- vừa được xem lúc

Tìm hiểu tổng quan về Redis

1. Lời mở đầu.

0 0 368