Bài test đơn giản test cho thấy hiệu quả của việc sử dụng cache

1. Giới thiệu

Trong bài viết trước, TheCodeRoot đã gửi đến các bạn bài viết hướng dẫn tích hợp sử dụng Redis Cache với Spring Boot, và trong bài viết ngày hôm nay chúng ta sẽ làm thử một bài testing API để thấy được hiệu quả giữa việc sử dụng Cache và không sử dụng Cache.

Các bạn có thể tìm đọc lại bài Tích Hợp Redis Cache vào Spring Boot ở đây.

2. Ngữ cảnh Testing:

Trong bài kiểm thử này chúng ta sẽ lập 1 API để gọi qua Hệ thống của bên Thứ 3 để lấy dữ liệu và hiển thị cho người dùng. Chúng ta sẽ dùng API của trang cung cấp JSON Place Holder như sau: 

https://jsonplaceholder.typicode.com/todos
  • Chúng ta sẽ dùng hàm Thread.sleep của Java để giả lập API của chúng ta sẽ tốn thời gian 5s để gọi API và xử lý trước khi trả dữ liệu cho người dùng. Sở dĩ bài viết dùng mốc thời gian 5s là để các bạn có thể thấy được rằng ngừoi dùng sẽ cảm thấy rất không thoải mái khi phải chờ đợi lâu.
  • Lần gọi đầu tiên API sẽ mất 5s để trả kết quả cho người dùng đầu tiên, nhưng kể từ những lần gọi tiếp theo  API sẽ chỉ tốn ... chưa tới 1/2s. Hãy tưởng tượng nếu website chúng ta hàng ngày có vài trăm, vài ngàn lượt gọi vào đúng API này: nếu tiết kiệm được thời gian 5s cho mỗi user, thì sau mỗi ngày, mỗi tháng lượng sẽ tiết kiệm được rất rất nhiều thời gian cho website và trên hết là cho người dùng.

3. Setup 

  • Setup project Spring Boot, các bạn xem lại và download source code từ bài hướng dẫn Spring Boot Hello World
  • Setup Redis Cache
  • Viết API giả lập:
    package thecoderoot.tutorial.rediscache.controller;
    
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.http.*;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    @RequestMapping(value = "/api/v1/todo")
    public class TodoController {
    
        private static final String TEST_URL = "https://jsonplaceholder.typicode.com/todos";
    
        @GetMapping(value = "")
        @Cacheable(value = "getAllToDo", key = "1")
        public ResponseEntity<String> getAll(){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Take 5 seconds to get data");
    
            RestTemplate restTemplate = new RestTemplate();
            return restTemplate.exchange(TEST_URL, HttpMethod.GET, new HttpEntity<>(new HttpHeaders()), String.class);
        }
    
        @GetMapping(value = "/updateTodo")
        @CacheEvict(value = "getAllToDo", key = "1")
        public ResponseEntity<String> update(){
            System.out.println("Cleared Cache");
            return ResponseEntity.ok().body("Data is updated . Also cleared Cache");
        }
    }
    
    

     

4. Tiến hành Testing

- Test case 1: Khi API chưa được cache, kết quả trả về mất hơn 5s:

 

- Test case 2: Khi API đã được Cache, thời gian trả về được cải thiện rất nhiều:

 

- Test case 3: Clear cache và gọi lại API:

Trong class Controller ở trên các bạn có thể thấy mình đã chuẩn bị sẵn hàm clear cache với @CacheEvict, chúng ta sẽ dùng hàm này để clear cache cho API "api/v1/todo'" và tiến hành gọi lại API này để xem thử thời gian trả về của nó.

 

5. Kết luận

Các bạn có thể thấy ngay được sự chênh lệch về thời gian giữa việc cache data và không cache. Trong các ứng dụng thực tế, cache là một phần không thể thiếu cho các Hệ Thống đòi hỏi sự đáp ứng nhanh cho người dùng. Các bạn có thể thấy rằng Facebook hay Google đều có lượng người dùng và dữ liệu ngừoi dùng cực kỳ khổng lồ. Google phải đáp ứng 63.000 request mỗi giây cho ngừoi dùng trên toàn thế giới và kết quả trả về trong thời gian chưa tới 1s.

Bài hướng dẫn chỉ đề cập sử dụng Redis Cache ở mức cơ bản nhất, và trên thưc tế Cache không chỉ là 1 Service chạy cùng Server mà có thể là cả một Hệ Thống hoành tráng không thua gì chính web app mà nó phục vụ. Instagram đã công bố giải pháp lưu trữ của họ không phải là SQL hay NoSQL mà chính là ...Redis Cache, để có thể đáp ứng được nhu cầu truy cập của người dùng. Tuy nhiên mọi thứ to lớn đều xuất phát từ cơ bản, TheCodeRoot hy vọng sẽ phần nào giúp cho các bạn có những cái nhìn đầu tiên nhất trong sự nghiệp .

Chúc các bạn thành công.

AutoCode.VN

minhnhatict@gmail.com Tools