Sử dụng các annotation Cache trong Spring: @Cacheable, @CacheEvict và @CachePut

Sử dụng các annotation Cache trong Spring: @Cacheable, @CacheEvict và @CachePut

Từ phiên bản 3.1, Spring đã hỗ trợ tính năng Cache. Cách sử dụng và nguyên lý hoạt động của nó tương tự như hỗ trợ quản lý Transaction của Spring. Cache trong Spring được áp dụng ở mức độ phương thức, với ý tưởng cốt lõi như sau: khi gọi một phương thức có cache, Spring sẽ lưu trữ các tham số phương thức và kết quả trả về như một cặp khóa-giá trị trong cache. Khi lần sau gọi phương thức với cùng các tham số, phương thức sẽ không được thực thi nữa, mà sẽ trả về kết quả trực tiếp từ cache. Do đó, khi sử dụng Spring Cache, chúng ta cần đảm bảo rằng phương thức cache có cùng kết quả trả về cho các tham số giống nhau.

Để sử dụng Spring Cache, chúng ta cần thực hiện hai việc:

  • Khai báo một số phương thức sử dụng cache
  • Cấu hình Spring hỗ trợ Cache

Tương tự như hỗ trợ quản lý Transaction của Spring, hỗ trợ Cache của Spring cũng có hai cách: dựa trên annotation và cấu hình XML.

@EnableCaching

@EnableCaching được sử dụng để kích hoạt tính năng cache, áp dụng trên lớp cấu hình cache hoặc lớp khởi động của Spring Boot.

@Cacheable

​ @Cacheable có thể được đánh dấu trên một phương thức hoặc trên một lớp. Khi đánh dấu trên một phương thức, nó cho biết phương thức đó hỗ trợ cache. Khi đánh dấu trên một lớp, nó cho biết tất cả các phương thức trong lớp đó đều hỗ trợ cache. Đối với một phương thức hỗ trợ cache, Spring sẽ lưu trữ kết quả trả về của nó sau khi được gọi, để lần sau sử dụng cùng các tham số để thực thi phương thức có thể lấy kết quả trực tiếp từ cache mà không cần thực thi phương thức đó lại.

Trong annotation @Cacheable, có một số tham số phổ biến để cấu hình:

  • valuecacheNames - biểu thị tên cache được liên kết. Ở đây cache đề cập đến một bộ lưu trữ cache riêng lẻ, không phải đối tượng cache khóa-giá trị cuối cùng.
  • key - biểu thị key của đối tượng cache, đây chính là key của cặp khóa-giá trị cache cuối cùng. Tham số này cần sử dụng biểu thức SpEL.
  • keyGenerator - biểu thị lớp được sử dụng để tạo key cache cho phương thức này. Chỉ có thể chọn một trong số keykeyGenerator, nếu không sẽ ném ra ngoại lệ IllegalStateException.
  • cacheManager - chỉ định bộ quản lý cache. Chúng ta sẽ thảo luận chi tiết hơn sau này.
  • condition - điều kiện của cache. Hỗ trợ SpEL, chỉ khi điều kiện cache được thỏa mãn, mới vào chế độ lấy giá trị từ cache.
  • unless - điều loại trừ. Hỗ trợ SpEL, khi điều loại trữ được thỏa mãn, sẽ gọi phương thức để lấy giá trị trực tiếp.
  • sync - chế độ cache không đồng bộ. Có sử dụng cách thức không đồng bộ khi lấy giá trị từ phương thức để cache hay không. Mặc định là false, chỉ trả về giá trị sau khi hoàn tất việc cache.
@Cacheable("danhSachNguoiDung")
    @Override
    public List<NguoiDung> timTatCa() {
        return iNguoiDungDao.timTatCa();
    }

@CachePut

@CachePut có thể khai báo một phương thức hỗ trợ tính năng cache. Khác với @Cacheable, phương thức được đánh dấu bằng @CachePut sẽ không kiểm tra trong cache trước khi thực thi, mà luôn thực thi phương thức đó và lưu kết quả vào cache được chỉ định. @CachePut phù hợp khi cập nhật nội dung trong bảng, cần cập nhật cả cache.

@CachePut cũng có thể được đánh dấu trên lớp và phương thức. Khi sử dụng @CachePut, các thuộc tính chúng ta có thể chỉ định giống như @Cacheable.

@CachePut(cacheNames = "danhSachNguoiDung")
@Override
public List<NguoiDung> capNhatNguoiDung() {
    iNguoiDungDao.xoaTheoId(2L);
    return iNguoiDungDao.timTatCa();
}

@CacheEvict

@CacheEvict được sử dụng để đánh dấu trên các phương thức hoặc lớp cần xóa các phần tử cache. Khi đánh dấu trên một lớp, nó có nghĩa là việc thực thi tất cả các phương thức trong lớp đó sẽ kích hoạt hoạt động xóa cache.

Trong annotation CacheEvict, có thêm hai tham số:

  • allEntries - xóa tất cả các phần tử cache dưới value hiện tại.
  • beforeInvocation - xóa cache trước khi phương thức thực thi.

Thuộc tính allEntries

​ allEntries có kiểu boolean, biểu thị có cần xóa tất cả các phần tử trong cache hay không. Mặc định là false, biểu thị không cần. Khi chỉ định allEntries là true, Spring Cache sẽ bỏ qua key được chỉ định. Đôi khi chúng ta cần xóa tất cả các phần tử trong cache, điều này hiệu quả hơn là xóa từng phần tử một.

@CacheEvict(cacheNames = "danhSachNguoiDung",allEntries = true)
@Override
public void xoaNguoiDung(long id) {
    iNguoiDungDao.xoaTheoId(id);
}

Thuộc tính beforeInvocation

​ Hoạt động xóa mặc định được kích hoạt sau khi phương thức thực thi thành công, tức là nếu phương thức ném ra ngoại lệ và không thể trả về thành công, hoạt động xóa cũng sẽ không được kích hoạt. Sử dụng beforeInvocation có thể thay đổi thời điểm kích hoạt hoạt động xóa. Khi chúng ta chỉ định giá trị thuộc tính này là true, Spring sẽ xóa các phần tử được chỉ định trong cache trước khi gọi phương thức.

@CacheEvict(cacheNames = "danhSachNguoiDung",beforeInvocation = true)
@Override
public void xoaNguoiDung(long id) {
    iNguoiDungDao.xoaTheoId(id);
}

Thẻ: Spring Caching annotations Java @Cacheable

Đăng vào ngày 27 tháng 5 lúc 11:36