EhCache là một bộ cache thuần Java có thể được tích hợp một cách dễ dàng với hầu hết các framework Java thông dụng như Spring và Hibernate. Nó thường được xem như là lựa chọn thuận tiện nhất cho các ứng dụng Java bởi vì nó có thể được tích hợp dễ dàng vào các project.
+++++
EhCache is a widely-used, pure Java cache that can be easily integrated with most popular Java frameworks, such as Spring and Hibernate. It is often considered to be the most convenient choice for Java applications since it can be integrated into projects easily.EhCache là một bộ cache thuần Java có thể được tích hợp một cách dễ dàng với hầu hết các framework Java thông dụng như Spring và Hibernate. Nó thường được xem như là lựa chọn thuận tiện nhất cho các ứng dụng Java bởi vì nó có thể được tích hợp dễ dàng vào các project.
Về cơ bản, apply cache đúng cách sẽ giúp bạn giảm tải rất nhiều cho server. Giả sử các bạn có 1 giá trị được lưu trong database cần sử dụng nhiều lần giữa nhiều màn hình khác nhau trong cùng 1 session. Thay vì mỗi lần sử dụng giá trị ta phải gọi xuống database sẽ gây lãng phí tài nguyên, các bạn có thể lưu giá trị đó trong cache và lấy ra mỗi khi cần đến nó.
Bài viết này được dịch từ bài viết gốc bằng tiếng Anh của tác giả Cong Liu. Các bạn có thể đọc bài viết gốc tại đây.
Trong bài viết này, giả sử các bạn đã có một project web service Spring MVC chạy trên Tomcat 8 server, project sử dụng Maven để build, IDE có thể là Eclipse hoặc Spring Tool Suite. Các bước thực hiện như sau:
1. CẤU TRÚC TỔNG THỂ CỦA PROJECT:
Bước tạo project này các bạn tự làm nhé, không có gì khó khăn cả.
2. TẠO MỘT RESTFUL WEB SERVICE ĐƠN GIẢN:
Tạo file SpringRestControllerWithEhCache.java trong package project.toptal.blog. Ở đây chúng ta sẽ có 2 service đơn giản làm nhiệm vụ đọc và ghi tin nhắn với id của tin nhắn được truyền vào từ tham số đường dẫn.
@RestController
@RequestMapping( "/" )
public class SpringRestControllerWithEhCache {
@Autowired
MessageService messageService;
@RequestMapping( value = "/message/{id}", method = RequestMethod.GET )
public String getMessage( @PathVariable Integer id ) {
String message = messageService.getMessage( id );
System.out.println( "get message ["+message+"] at "+new Date() );
return message;
}
@RequestMapping( value = "/message/set/{id}/{message}", method = RequestMethod.POST )
public String setMessage( @PathVariable Integer id, @PathVariable String message ) {
System.out.println( "set message ["+message+"] at "+new Date() );
messageService.setMessage( id, message );
return message;
}
}
Tạo tiếp MessageService.java trong package com.toptal.blog.service. Lớp này có nhiệm vụ truy cập vào database chứa message, nhưng ở đây, để đơn giản chúng ta sẽ dùng HashMap thay cho DB để lưu trữ message.
@Service
public class MessageService {
private ConcurrentHashMap<Integer, String> messages
= new ConcurrentHashMap<Integer, String>();
public String getMessage( Integer id ) {
System.out.println( "Getting data from SOR......" );
return messages.get( id );
}
public void setMessage( Integer id, String message ){
messages.put( id, message );
}
}
+ Để test thử service vừa dựng lên các bạn hãy deploy project trong Tomcat.
+ Để set message, với id=1, hãy tạo một HTTP POST request tại địa chỉ: http://localhost:8080/EhCacheExample/message/set/1/test_message với 'test_message' là nội dung của phần tin nhắn.
+ Nếu bước set message thành công, các bạn sẽ có thể lấy ra được nội dung tin nhắn bằng 1 HTTP GET request tại địa chỉ: http://localhost:8080/EhCacheExample/message/get/1 với '1' là id của tin nhắn.
3. APPLY EHCACHE VÀO PROJECT:
3.1 Cập nhật dependecies để sử dụng EhCache Annotations:
Nếu các bạn sử dụng Maven thì việc apply EhCache là rất đơn giản, chỉ cần thêm đoạn dependency sau vào file pom.xml. Lưu ý trong project này chúng ta sử dụng EhCache phiên bản 1.2.0, các phiên bản mới hơn có thể sẽ có khác biệt trong cách implementation cụ thể.
<!-- ehcache -->
<dependency>
<groupId>com.googlecode.ehcache-spring-annotations</groupId>
<artifactId>ehcache-spring-annotations</artifactId>
<version>1.2.0</version>
</dependency>
3.2 Cấu hình EhCache:
Tạo file ehcache.xml trong đường dẫn src/main/resources. File này là bắt buộc để EhCache có thể hoạt động một cách đúng đắn. Nó giúp định nghĩa tên của các cache và các thuộc tính của từng cache một.
<ehcache xmlms:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
<diskStore path="cache" />
<cache
name="messageCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="10"
overflowToDisk="false"
memoryStoreEvictionPolicy="LFU" />
</ehcache>
3.3 Chạy thử:
Bây giờ mọi thứ đã gần như sẵn sàng, các bạn chỉ cần thêm annotation @Cacheable vào method getMesssage trong class MessageService nữa là xong.
@Cacheable( cacheName = "messageCache" )
public String getMessage( Integer id ) {
System.out.println( "Getting data from SOR......" );
return messages.get( id );
}
+ Để kiểm tra, các bạn tạo 1 HTTP POST request mới tại địa chỉ: http://localhost:8080/EhCacheExample/message/set/1/newMessage
+ Sau đó, lấy ra message với id=1 nhiều lần bằng cách gọi tới HTTP GET request tại địa chỉ: http://localhost:8080/EhCacheExample/message/1
+ Nếu đọc nội dung trong console, các bạn sẽ thấy Message service chỉ được gọi lên 1 lần đầu để lấy lên message, các lần sau sẽ message sẽ tự động được lấy từ trong cache ra. Bởi vì chúng ta đã cấu hình trong ehcache.xml tham số timeToLiveSeconds là 10 giây nên sau mỗi 10 giây cache sẽ được refresh và web service sẽ lại phải gọi xuống MessageService để lấy lên nội dung message.
set message [newMessage] at Sun Dec 06 23:55:39 MST 2015
get message [newMessage] at Sun Dec 06 23:55:42 MST 2015
Getting data from SOR......
get message [newMessage] at Sun Dec 06 23:55:47 MST 2015
get message [newMessage] at Sun Dec 06 23:55:49 MST 2015
get message [newMessage] at Sun Dec 06 23:55:54 MST 2015
Getting data from SOR......
4. CẤU TRÚC TỔNG THỂ CUỐI CÙNG CỦA PROJECT:
Trên đây là những bước cơ bản để cấu hình EhCache cho 1 project Spring MVC ở mức cơ bản. Hy vọng các bạn đã hiểu được cơ chế và cách thức làm việc của EhCache và có thể áp dụng được nó vào các dự án của mình. Chúc các bạn thành công.
Theo Toptal