banner_thiet_ke_website

Caching REST Service Spring Boot với Redis

Giới thiệu

Redis là viết tắt của Remote Dictionary Server. Redis là một hệ thống cơ sở dữ liệu NoSQL, lưu trữ dữ liệu theo dạng Key - Value và được lưu trên bộ nhớ RAM của Server. Cơ chế này giúp Redis đọc dữ liệu trở nên nhanh hơn nhiều lần so với đọc từ database.

Ở bài này, chúng ta sẽ tích hợp Redis Cache với Spring. Mặc dù Redis là một kho lưu trữ cấu trúc dữ liệu trong bộ nhớ nguồn mở, được sử dụng làm cơ sở dữ liệu, cache và message broker, bài này sẽ chỉ trình bày tích hợp bộ nhớ đệm cache.

Cài đặt Redis

MacOS: Sử dụng HomeBrew để cài đặt Redis

brew install redis
brew services start redis

Kiểm tra

redis-cli ping

Ubuntu: Chạy các lệnh sau

sudo apt install redis-server
sudo nano /etc/redis/redis.conf

Cập nhật supervised

supervised systemd
sudo systemctl restart redis.service

Kiểm tra

redis-cli ping

Sử dụng Redis

Project Spring

Trước tiên, chúng ta cần có một project Spring Boot hoặc các bạn có thể download project của mình ở bài trước

Xem thêm: Tạo Rest CRUD API đơn giản trong Spring Boot

Thư viện Maven

Thêm dependency vào pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Cấu hình Redis Cache

Chúng ta có thể khai báo cấu hình Redis chỉ với 3 dòng trong application.properties

# Redis
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379

Ngoài ra, thêm annotation @EnableCaching vào Spring Boot main class

@SpringBootApplication
@EnableCaching
public class RestfulSpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(RestfulSpringBootApplication.class, args);
    }
}

Cách sử dụng

Ở đây chúng ta sẽ cache dữ liệu ở Controller

@Cacheable

Chúng ta sẽ cache user theo id của user.

@GetMapping("{id}")
@Cacheable(value = "user", key = "#id")
public User findUser(@PathVariable Integer id) {
    return userService.findUser(id);
}

Method findUser sẽ lưu một user vào bộ nhớ cache được xác định bằng key id. Sau khi lưu, mỗi khi gọi nó sẽ lấy dữ liệu từ Redis mà không cần gọi vào database.

@CachePut

Cập nhật dữ liệu sử dụng @CachePut. Một user được xác định bằng id và được cập nhật dữ liệu.

@PutMapping
@CachePut(value = "user", key = "#user.id")
public User update(@RequestBody User user) {
    return userService.update(user);
}

@CacheEvict

Xoá dữ liệu khi dữ liệu trong database bị xoá sử dụng @CacheEvict

@DeleteMapping
@CacheEvict(value = "user", key = "#user.id")
public void delete(@RequestBody User user) {
    userService.delete(user);
}

Lưu ý: Redis không giới hạn lưu trữ dữ liệu trên hệ thống 64bit. Tuy nhiên trên hệ thống 32bit, nó chỉ cho phép lưu tối đa 3GB dữ liệu. Khi bộ nhớ đạt giới hạn, dữ liệu cũ sẽ bị xoá và nhường chỗ cho dữ liệu mới.

Tổng kết

Trên đây là bài viết tích hợp Redis vào Spring Boot một cách cấu hình đơn giản, nhanh chóng. Chúc các bạn thành công!