- vừa được xem lúc

Tạo một project đơn giản với Spring boot cache - Thymeleaf và sử dụng annotation "@Scheduled" cho trigger

0 0 25

Người đăng: Kien Pham

Theo Viblo Asia

Trong bài viết này, tôi sẽ hướng dẫn các bạn 2 phần:

  • Sử dụng Spring boot cache để cache data response

  • Clear cache sau mỗi lần call api update data

Công cụ và thư viện được sử dụng trong bài viết:

  • Spring tool suite 4
  • Spring boot 3.0.1
  • Spring boot cache
  • Spring boot thymeleaf
  • Maven 3
  • Java 11
  • Postman

Trong bài viết này tôi không hướng dẫn lại về Thymeleaf, tham khảo lại các bài viết dưới đây:

https://viblo.asia/p/tao-mot-project-voi-spring-boot-va-elasticsearch-841-su-dung-thu-vien-spring-data-elasticsearch-huong-dan-cai-dat-va-su-khac-nhau-giua-2-phien-ban-8xx-voi-7xx-elasticsearch-Rk74aRXvJeO

https://viblo.asia/p/tao-mot-project-voi-spring-boot-thymeleaf-elasticsearch-su-dung-http2-tao-service-run-elasticsearch-yZjJYjolLOE

1. Cấu trúc thư mục:

2. Nội dung pom file:

3. Nội dung application class:

Trong class applciation, tôi khai báo annotation "@EnableCaching" để apply cache

4. Nội dung ContactController class:

Trong ContactController, tôi khởi tạo trước 1 list contacts với static block

5. Nội dung ContactModel class:

Sau khi tạo xong các class ở trên, tôi start project lên:

6. Nội dung "index.html" file:

Để query data từ list trong Thymeleaf, các bạn có thể sử dụng "th:each" và để đọc những attributes -> có thể sử dụng "th:text"

Tiếp theo, trước khi apply cache cho api tôi sẽ dùng postman để test thời gian phản hồi(time response) khi chưa apply cache, tôi call api "http://localhost:8080/contact/1"(1 là id contact):

Time response khoảng 35ms

Tiếp theo, tôi thử apply cache cho api ở trên. Tôi thêm annotation "@Cacheable":

Tại annotation "@Cacheable" tôi để name value là "contacts", có nghĩa là khi lần call api đầu tiên -> sẽ get data và kết quả trả về sẽ được lưu trong cache với tên là "contacts" và key value là id , name value các bạn đặt tên tuỳ ý

Sau khi apply cache, tôi tiến hành kiểm tra với 1 số kịch bản như bên dưới để xác định cache được apply thành công hoặc chưa:

* Kịch bản 1: Call api "http://localhost:8080/contact/1" với id là "1" lần thứ 1:

Tại thời điểm này, tôi có in một message trong function -> cho lần đầu tiên sẽ vẫn xử lý get data trong function và show message, cũng tại thời điểm này data response sẽ được lưu vào cache

Time response: 288ms

* Kịch bản 2: Call api "http://localhost:8080/contact/1" với id là "1" lần thứ 2:

Tại thời điểm này, hệ thống sẽ kiểm tra trong cache với name "contacts" để thấy với id là "1" có data đang được lưu trong cache hay không, nếu thấy có data trong cache -> sẽ load data từ cache(không cần vô function để get data)

Các bạn có thể thấy ngoài message được in trong lần call api đầu tiên -> lần thứ 2 không có message được in ra -> data được lấy trực tiếp từ cache

Check Postman, thấy time response giảm đáng kể còn khoảng 7ms

Tôi tiếp tục call api tiếp lần thứ 3 và thấy time response chỉ còn khoảng 4ms:

* Kịch bản 3: Call api "http://localhost:8080/contact/2" với id là "2" lần thứ 1:

Với kịch bản này, tôi muốn kiểm tra để thấy sau khi data response của contact id là "1" được lưu trong cache thì tiếp đến sau khi call get data contact id là "2" -> có show message hay không ?

=> Các bạn thấy với contact id là "2" nó sẽ call bên trong function để get data bởi vì trong cache không có thông tin id là "2"

* Kịch bản 4: Call api update contact "http://localhost:8080/updateContact/1" với id là "1":

Trong kịch bản này, tôi thử update data cho id contact là "1" và sau kịch bản này tôi sẽ kiểm tra call lại api get detail contact id là "1" để thấy data response có được lấy theo data mới hay cũ(data đã được lưu trong cache trước đó)

Data body update cho id contact là "1":

{ "id": "1", "name": "Visible Mask", "phoneNumber": "123456789", "education": "ABC", "occupation": "Java Dev"
}

=> Update data success

* Kịch bản 5: Call api get detail contact "http://localhost:8080/contact/1" với id là "1":

Tại kịch bản này, tôi sẽ check sau khi call api get detail contact với id là "1" -> data response sẽ vẫn lấy từ cache trước đó(data cũ) hay call vô function để get new data

=> Như các bạn thấy, hệ thống vẫn sẽ load data từ cache được lưu trước đó. Vậy, chúng ta cần xử lý clear cache cho mục đích load new data sau khi update

Để tiến hành clear cache, tôi sử dụng annotation "@CacheEvict", tôi tạo mới 1 function để xử lý clear cache với id tương ứng và add annotation vào:

Tôi để name value là "contacts" mục đích để khi call đến function clear cache sẽ clear cache trong cache name "contacts" với id(key) tương ứng

* Kịch bản 6: Call api clear cache "http://localhost:8080/clearCache/1" với id cần clear trong cache là "1":

* Kịch bản 7: Call api get detail contact "http://localhost:8080/contact/1" với id là "1":

Sau khi clear cache success -> sau khi call api get detail contact id là "1" sẽ được load theo data mới nhất:

Tiếp theo, tôi hướng dẫn các bạn sử dụng annotation "@Scheduled" để trigger function tự động clear all cache. Đầu tiên tôi tạo tiếp 1 function xử lý clear all cache:

Để enable schedule, tôi add annotation "@EnableScheduling" trong class application:

Hiện tại, tôi set timeout là sau 20 second(20000 milisecond) -> function clear all cache sẽ được trigger

Sau khi update xong, tôi restart project và test call api get detail contact với id là "1", trong lần call đầu tiên -> sẽ show message và save response data trong cache:

Sau 20 second, function clear all cache được trigger thành công:

Trong bài viết tiếp theo, tôi sẽ hướng dẫn các bạn lưu data response tại cache browser, các bạn cũng thấy mỗi khi chúng ta thực hiện 1 action nào đó trên web -> sẽ send request đến backend server để xử lý và response data, việc chúng ta xử lý lưu cache trong bài viết này chỉ giảm thời gian xử lý tại backend, nên nếu chúng ta xử lý lưu cache tại browser -> về mặt logic nó cũng tương tự như xử lý tại backend, nghĩa là cho lần tiên gửi request(call api) đến backend -> backend xử lý dữ liệu và response data thì lúc này chúng ta sẽ lưu response data này trong cache browser và cho những lần request tiếp theo -> sẽ load data trực tiếp từ cache browser, không cần call api đến backend.

Download source: http://megaurl.in/7leygd2

Bình luận

Bài viết tương tự

- vừa được xem lúc

Caching đại pháp 1: Nấc thang lên level của developer

Bí quyết thành công trong việc đáp ứng hệ thống triệu user của những công ty lớn (và cả công ty nhỏ). Tại sao caching lại là kỹ thuật tối quan trọng để phù phép ứng dụng rùa bò của chúng ta thành siêu phẩm vạn người mê.

0 0 82

- vừa được xem lúc

Cache dữ liệu Nodejs với Redis

Một tí gọi là lý thuyết để anh em tham khảo. Cache là gì. Lợi ích của việc cache data. .

0 0 111

- vừa được xem lúc

In-memory cache là gì?

Bài viết gốc: https://www.tranthanhdeveloper.com/2020/12/in-memory-cache-la-gi.html.

0 0 38

- vừa được xem lúc

Cache là gì và nguyên lý hoạt động của cache

Trong vài trở lại đây, công nghệ thông tin đã trở thành bàn đạp cho sự cải thiện mạnh mẽ cho vô số các loại hình kinh doanh. Đồng thời, các kiến trúc phần mềm ngày càng trở nên phức tạp và số lượng ng

0 0 257

- vừa được xem lúc

Tăng tốc website: Sử dụng Page Cache - Application Cache

Như đã đề cập trong Lời mở đầu, trong phần này tôi sẽ đề cập tới cách thực hiện page cache đầu tiên đó là Application Cache - tôi tạm gọi như vậy, với ý nghĩa là thực hiện cache ngay trong web applica

0 0 55

- vừa được xem lúc

Tăng tốc website: Sử dụng Page Cache - Lời mở đầu

Bài đầu tiên trong series này, tôi sẽ điểm lại một vài nội dung cơ bản nhất để các bạn chưa biết đến kỹ thuật Page Cache cũng có thể nắm được. Các bạn nào đã biết thì cũng có thể đọc cho vui rồi cho t

0 0 41