Tổng quan
Trong các ứng dụng Internet truy cập đồng thời hiện nay, vai trò của bộ nhớ đệm rất quan trọng và giúp cải thiện hiệu suất chương trình. Spring bắt đầu với 3.x, cũng giới thiệu hỗ trợ cho Cache. Spring Boot mặc định sử dụng SimpleCacheConfiguration bằng cách sử dụng ConcurrentMapCacheManager để thực hiện cache nhưng bài viết này sẽ chỉ ra cách áp dụng bộ đệm Guava Cache cho các ứng dụng Spring Boot.
Guava Cache là một triển khai cache, cung cấp các cơ
chế an toàn luồng, do đó nó đặc biệt phù hợp với các tình huống trong đó mã
code được dự kiến sẽ được gọi nhiều lần.
Chuẩn bị
- Chuẩn bị cơ sở dữ liệu và bảng dữ liệu và chèn dữ liệu thử nghiệm thích hợp (MySQL)
Ví dụ: tôi đã chuẩn bị một bảng người dùng với một số bản ghi:

Chuẩn bị cơ sở dữ liệu và bảng dữ liệu MySQL
Chúng tôi sẽ xem xét ảnh hưởng của bộ đệm Guava Cache sau hoạt động truy cập cơ sở dữ liệu mô phỏng.
Dự án xây dựng: Springboot + MyBatis + MySQL + Guava Cache
Thêm phụ thuộc sau vào pom.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!–for mybatis–> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!–for Mysql–> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!– Spring boot Cache–> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!–for guava cache–> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0.1-jre</version> </dependency> </dependencies> |
Tạo một lớp cấu hình Guava Cache
Giới thiệu hồ sơ của Guava Cache GuavaCacheConfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@Configuration @EnableCaching public class GuavaCacheConfig { @Bean public CacheManager cacheManager() { GuavaCacheManager cacheManager = new GuavaCacheManager(); cacheManager.setCacheBuilder( CacheBuilder.newBuilder(). expireAfterWrite(10, TimeUnit.SECONDS). maximumSize(1000)); return cacheManager; } } |
Cấu hình Guava Cache rất đơn giản, chẳng hạn như thời gian tồn tại của bộ đệm cache cấu hình mã ở trên là 10 giây, số lượng bộ nhớ cache tối đa là 1000
Cấu hình application.properations
1 2 3 4 5 6 7 8 9 10 11 12 |
server.port = 82 # Cấu hình nguồn dữ liệu Mysql spring.datasource.url = jdbc: mysql: //121.116.23.145: 3306 / demo? UseUnicode = true & characterEncoding = utf-8 & useSSL = false spring.datasource.username = root spring.datasource . Datasource.driver-class-name = com.mysql.jdbc.Driver # mybatisConfiguration mybatis.type-aliases-pack = cn.codesheep.springbt_guava_cache.entity mybatis.mapper-vị trí = classpath: mapper / *. xml mybatis.configuration.map-underscore-to |
Viết các hoạt động cơ sở dữ liệu và mã doanh nghiệp được lưu trữ bởi Guava Cache
- Viết thực thể
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class User { private Long userId; private String userName; private Integer userAge; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getUserAge() { return userAge; } public void setUserAge(Integer userAge) { this.userAge = userAge; } } |
- Viết bản đồ
1 2 3 4 5 6 |
public interface UserMapper { List<User> getUsers(); int addUser(User user); List<User> getUsersByName( String userName ); } |
- Viết dịch vụ
. 1 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getUsers() { return userMapper.getUsers(); } public int addUser( User user ) { return userMapper.addUser(user); } @Cacheable(value = “user”, key = “#userName”) public List<User> getUsersByName( String userName ) { List<User> users = userMapper.getUsersByName( userName ); System.out.println( “从数据库读取,而非读取缓存!” ); return users; } } |
Nhìn nó rất rõ ràng, chúng tôi getUsersByName
thêm một chút về giao diện: @Cacheable
. Đây là một trong bộ nhớ cache sử dụng các chú thích, ngoài việc sử dụng phổ biến có @CachePut
và @CacheEvit
được giải thích ngắn gọn:
@Cacheable
: Được bố trí tronggetUsersByName
các giá trị trả về sẽ được bổ sung vào phương pháp cache. Đồng thời, khi truy vấn, nó sẽ được lấy từ bộ đệm trước và nếu không tồn tại, nó sẽ bắt đầu truy cập vào cơ sở dữ liệu.@CachePut
: Khi xử lý trên phương pháp, có thể được thực hiện theo các thông số được xác định điều kiện đệm, mà@Cacheable
ngoại trừ@CachePut
phương pháp này không được đánh dấu để kết quả kiểm tra có hay không có được thực hiện trước khi bộ nhớ cache trước khi thực hiện, nhưng phương pháp này được thực hiện mỗi khi Và kết quả thực hiện được lưu trữ trong bộ đệm được chỉ định dưới dạng cặp khóa-giá trị, do đó, nó chủ yếu được sử dụng cho các hoạt động bổ sung và sửa đổi dữ liệu.@CacheEvict
: Khi được định cấu hình trên một phương thức, có nghĩa là dữ liệu tương ứng sẽ bị xóa khỏi bộ đệm.
- Viết điều khiển
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@RestController public class UserController { @Autowired private UserService userService; @Autowired CacheManager cacheManager; @RequestMapping( value = “/getusersbyname”, method = RequestMethod.POST) public List<User> geUsersByName( @RequestBody User user ) { System.out.println( “——————————————-” ); System.out.println(“call /getusersbyname”); System.out.println(cacheManager.toString()); List<User> users = userService.getUsersByName( user.getUserName() ); return users; } } |
Chuyển đổi lớp chính của ứng dụng Spring Boot
Chủ yếu mở chức năng bộ đệm một cách rõ ràng thông qua chú thích @EnableCaching trên lớp khởi động.
1 2 3 4 5 6 7 8 |
@SpringBootApplication @MapperScan ( “cn.codesheep.springbt_guava_cache”) @EnableCaching public class SpringbtGuavaCacheApplication { public static void main (String [] args) { SpringApplication.run (SpringbtGuavaCacheApplication.class, args); } } |
Cấu trúc của toàn bộ dự án cuối cùng đã hoàn thành như sau:

Hoàn thiện cấu trúc kỹ thuật
Thí nghiệm thực tế
localhost:82/getusersbyname
Quan sát hiệu ứng nhiều lần với giao diện POST dữ liệu:

Gửi dữ liệu đến giao diện
Bạn có thể thấy rằng hiệu ứng kích hoạt và vô hiệu hóa bộ đệm như sau (thời gian hiệu lực của người dùng bộ đệm được đặt thành 10 giây trong tệp cấu hình của Guava Cache ở trên):
Do khả năng hạn chế, nếu có sai sót hoặc bất cập, xin vui lòng phê bình và sửa chữa, và học cách giao tiếp với nhau!