Chào mừng các bạn đã quay trở lại với thachleblog. Thứ 7 hôm qua xem phim với ngủ nguyên ngày rồi, hôm nay code tí rồi đi cafe thôi, hehe. Bài viết hôm nay mình sẽ giới thiệu một library hỗ trợ cache khá là “nhẹ” và tiện dụng, đó chính là Guava. Với Guava, các bạn sẽ dễ dàng hiểu được cơ chế làm việc cũng như ưu điểm của cache, đồng thời có thể tìm hiểu thêm để apply cho dự án của mình. Chúng ta cùng bắt đầu nào.
Giới thiệu chung
Guava là một thư viện mã nguồn mở Java, được phát triển bởi Google (xài hàng của anh Google thì yên tâm rồi 😀 ). Guava cung cấp nhiều methods hỗ trợ cho xử lý String, Collections, Caching, Concurrency… trong project hiện tại của mình cũng xài rất nhiều. Nhưng bài viết hôm nay mình chỉ giới thiệu đến một Guava cache thôi. Các phần khác, nếu có hứng thú các bạn có thể tự tìm hiểu nhé.
Guava cache
Guava hỗ trợ in – memory cache, lưu trữ dữ liệu dưới dạng cặp dữ liệu key – value (xem thêm về memory cache tại đây). Guava chủ yếu hỗ trợ 2 method cache chính đó là LoadingCache và Cache.
- LoadingCache: tự động load dữ liệu vào cache nếu trong cache chưa có dữ liệu
- Cache: chúng ta phải thực hiện các thao tác kiểm tra sự tồn tại của key trước khi put value vào cache, hay get cache
Guava hỗ trợ thread – seft trong thao tác dữ liệu với cache. Tuy nhiên, Guava không hỗ trợ distributed cache.
Implement
Phần implement này mình chỉ demo đơn giản thao tác LoadingCache của Guava. Dữ liệu sẽ tự động được thêm vào cache sau khi load nếu trong cache chưa có dữ liệu.
Implement LoadingCache khá đơn giản, chúng ta chỉ việc import thư viện Guava, implement inter face LoadingCache<K, V>. Guava hỗ trợ các phương thức thiết lập cho cache như maximumSize(int), expireAfterAccess()…
Code demo
Class StudentGuavaCache, chúng ta có thể override method load hoặc loadAll để add dữ liệu vào cache
package thach.le.guava; import java.util.concurrent.TimeUnit; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; public class StudentGuavaCache { private static LoadingCache<Integer, Student> cache; static { cache = CacheBuilder.newBuilder() .maximumSize(100) //set size .expireAfterWrite(10, TimeUnit.MINUTES) //set time expire .build( new CacheLoader<Integer, Student>() { @Override return getEmployeeById(id); } } ); } public static LoadingCache<Integer, Student> getLoadingCache() { return cache; } // this method demo get data from database or file public static Student getEmployeeById(int id) { Student student = new Student(1, "Thach Le"); return student; } } class Student { private int id; this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } return name; } this.name = name; } }
Có các thiết lập cho LoadingCache như set số element tối đa cho cache, time expire (tránh trường hợp lưu cache quá lâu, nhiều dẫn đến thiếu RAM. Các bạn có thể xem thêm ở link bên dưới để biết thêm về các thiết lập.
Class Test
package thach.le.guava; import java.util.concurrent.ExecutionException; import com.google.common.cache.LoadingCache; public class GuavaTest { GuavaTest guavaTest = new GuavaTest(); try { // Access student first time with id 1, getStudentUsingGuava() will // be called. // The second time we get student, data will cache } catch (ExecutionException e) { } } private Student getStudentUsingGuava(int id) throws ExecutionException { LoadingCache<Integer, Student> cache = StudentGuavaCache.getLoadingCache(); return cache.get(id); } }
Ở ví dụ trên, mình thực hiện khởi tạo object Student sau đó gọi thông qua cach. Các bạn có thể đọc thêm docs và debug để hiểu thêm về cách sử dụng. Ở trên là demo cách cơ bản nhất là load dữ liệu vào cache bằng cách override mothod load(). Thông thường chúng ta sẽ dùng các phương thức put() để thêm element vào cache và sau đó check và get() để lấy value.
Kết quả: từ lần thứ 2 trở đi, dữ liệu sẽ được load từ cache (sẽ không gọi method getStudent() nữa)
Vừa rồi là phần trình bày của mình về Guava. Đối với mình, nếu được đọc bài blog này trước thì chắc chắn mình sẽ tiết kiệm được khối time để tìm hiểu về Guava, do đó mình mới viết bài chia sẻ này, hehe. Hy vọng giúp các bạn hiểu về cache cũng như có thể apply Guava cho dự án của mình. Hẹn gặp lại các bạn ở các bài viết sau.
Còn rất nhiều tính năng khác của Guava, các bạn có thể xem thêm tại: https://github.com/google/guava/wiki
Thằng này hơn gì thằng ehcache không anh?
Guava chỉ là cache local cho từng instance, ưu điểm là gọn, nhẹ nên thích hợp cache cho các service mà có ít instance. Nếu em có xài guava cho các tính năng khác thì xài luôn cache cho tiện. Về tính năng cache thì sẽ không hỗ trợ nhiều bằng ehcache.
Pingback: Memcached: giới thiệu và cài đặt » Thach Le
Pingback: Heap dump trong Java » Thach LeThach Le