Một số mẹo và lưu ý khi sử dụng Cache trong Spring

Cẩn thận với default cache key

Việc caching một method thực sự rất dễ dàng. Chỉ cần thêm @Cacheable phía trên tên của method giống như thế này:

@Cacheable(value = "address")
 public List getAddressOfRestaurant(Restaurant restaurant) {
 }

Tuy nhiên, nó cũng rất dễ bị mất kiểm soát cache key. Ở ví dụ trên chúng ta đang sử dụng default key generation để tạo ra 1 SimpleKey  chứa tất cả các parameter của method được gọi đến. Điều này yêu cầu các parameter trên cần thực hiện hashCode()/equals() mỗi lần method được gọi. Và như vậy performance  của việc hashCode() và equals() cũng sẽ ảnh hưởng đến lấy dữ liệu từ cache cũng như object bị thay đổi dẫn đến hashCode() không còn như ban đầu.

Thêm một điều quan trọng nữa, khi những parameter trở thành 1 phần của cache key và điều này thực sự không cần thiết nên làm tăng kích thước của cache. Xem xét lại ví dụ ở trên đang sử dụng Restaurant làm key. Tuy nhiên nếu restaurant có một đống các data phức tạp rồi có vài collection. Vậy nên hay cân nhắc tạo key trong các trường hợp có parameter phức tạp.

@Cacheable(value = "address", key = "#restaurand.id")
 public List getAddressOfRestaurant(Restaurant restaurant) {
 }

Caching and SchedulING

Để có thể tự động update value trong cache định kỳ hoặc clear cache theo thời gian mong muốn ta cần đến sự trợ giúp của Scheduling.

Enable Scheduling

@Configuration
@EnableScheduling
@EnableCaching
class CacheConfig { ... }

Clear cache

@Scheduled(fixedRateString = '5000')
@CacheEvict(value = "student", allEntries = true)
void clearStudentCache() {
    log.debug("@student cache is cleared off!")
}

Clear toàn bộ cache ‘student’ sau mỗi 5s

UPDATE CACHE

@Scheduled(fixedRateString = '5000')
Student clearStudentCache() {
    log.debug("update or insert student")
    updateCache("id01")
}

@CachePut(value = "student", key = "#id")
updateCache(Stirng id){
    Student st = repository.getStudent()
    return st
}

Ví dụ trên cứ mỗi 5s sẽ update lại student có key là ‘id01’ vào cache.