Caching đôi khi là một vấn đề rất quan trọng của một số ứng dụng với số lượng request của người dùng rất nhiều. Nó vừa giải quyết các vấn đề về performance của ứng dụng và giảm thiểu các thao tác I/O liên quan đến ứng dụng. Trong bài viết này, mình giới thiệu với các bạn về EhCache, một open-source về caching được rất nhiều người sử dụng.
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:
với EhCache dependency như sau:
1 2 3 4 5 |
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.9.6</version> </dependency |
Để làm ví dụ cho bài viết này, mình sẽ sử dụng EhCache để lưu thông tin user và chúng ta có thể retrieve thông tin user từ cache sử dụng ID của user đó.
Mình sẽ tạo mới class để chứa thông tin user:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.huongdanjava.ehcache; public class User { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
và class main để chạy ứng dụng có nội dung ban đầu như sau:
1 2 3 4 5 6 7 8 |
package com.huongdanjava.ehcache; public class Application { public static void main(String[] args) { } } |
Đối tượng quản lý cache trong EhCache là đối tượng Cache và để có được đối tượng này, điều đầu tiên các bạn cần phải làm là tạo mới đối tượng CacheManager, sử dụng class CacheManagerBuilder như sau:
1 2 |
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .build(true); |
Ở đây, mình khởi tạo CacheManager mà không có bất kỳ cấu hình thêm nào cả. Các bạn có thể trong lúc khởi tạo CacheManager thì khởi tạo thêm một số Cache mà mình muốn. Mình thì muốn rạch ròi ra nên mình sẽ khởi tạo đối tượng Cache sau.
Bây giờ thì các bạn có thể sử dụng phương thức createCache() của CacheManager để tạo mới đối tượng Cache cho mình. Phương thức createCache() này có 2 phương thức overload với tham số chung đầu tiên của 2 method này là tên của cache. Còn tham số thứ hai thì liên quan đến cấu hình của cache.
1 |
<K, V> Cache<K, V> createCache(String alias, CacheConfiguration<K, V> config) |
và:
1 |
<K, V> Cache<K, V> createCache(String alias, Builder<? extends CacheConfiguration<K, V>> configBuilder); |
Các bạn hãy nhớ là, chúng ta sẽ lưu cache bằng key và value, lấy value bằng key. Mỗi cache sẽ có tên, giúp chúng ta có thể khai báo cache nào chúng ta cần lấy thông tin. Khi khởi tạo cache, chúng ta sẽ cần phải khai báo kiểu dữ liệu của key và value trong mỗi cache.
Ví dụ trên của mình, thì mình sẽ lưu cache với key là ID với kiểu dữ liệu là Long, còn Value của mình sẽ kiểu dữ liệu là User như sau;
1 2 3 4 |
Cache<Long, User> userCache = cacheManager.createCache("user", CacheConfigurationBuilder .newCacheConfigurationBuilder( Long.class, User.class, ResourcePoolsBuilder.heap(10))); |
Đoạn code trên mình sử dụng class CacheConfigurationBuilder để khai báo thông tin cấu hình của cache “user”. Chúng ta sử dụng class ResourcePoolsBuilder với phương thức static heap() để khai báo số lượng thông tin có trong một cache.
Bây giờ thì chúng ta có thể lưu trữ thông tin cache sử dụng phương thức put() như sau:
1 2 3 4 5 |
User user = new User(); user.setId(1L); user.setName("Khanh"); userCache.put(user.getId(), user); |
Sau khi đã có thông tin trong cache thì các bạn cũng có thể lấy thông tin trong cache ra như sau:
1 2 3 |
Cache<Long, User> userCache1 = cacheManager.getCache("user", Long.class, User.class); User user1 = userCache1.get(1L); System.out.println(user1.getName()); |
Kết quả: