1. Tổng quan

Với chức năng proxy quen thuộc của mình, spring sẽ gọi đến các thư viện ở tầng thấp ví dụ Jedis hoặc Lettuce, và các thư viện này sẽ có nhiệm vụ tương tác với Redis. Các thư viện ở tầng thấp đa phần sẽ sử dụng bye array để giao tiếp với Redis, khi chúng ta sử dụng spring, nó sẽ giúp chúng ta việc chuyển đối các đối tượng java sang byte array, nghĩa là Dev sẽ chỉ cần quan tâm đến đối tượng Java mà thôi.

2. Cài đặt

Để có thể sử dụng spring redis, chúng ta sẽ cần thêm vào dependencies của project, ví dụ với gradle:

implementation 'org.springframework.boot:spring-boot-starter:' + springBootVersion
implementation 'org.springframework.boot:spring-boot-starter-web:' + springBootVersion
implementation 'org.springframework.boot:spring-boot-starter-data-redis:' + springBootVersion
implementation 'redis.clients:jedis:' + jedisVersion

Với springBootVersion=2.7.0jedisVersion=3.8.0.

3. Ví dụ

Giả sử chúng ta cần sử dụng Redis cho dự án quản lý sách, và thư viện chúng ta lựa chọn đó là jedis. Đầu tiên chúng ta sẽ cần tạo ra 1 lớp cấu hình cho redis, ví dụ:

package com.tvd12.example.spring_boot_redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

@Configuration
public class RedisConfig {
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName("localhost");
        configuration.setPort(6379);
        return new JedisConnectionFactory(configuration);
    }

    @Bean
    public RedisTemplate redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    }
}

Tiếp theo chúng ta sẽ cần khai báo đối tượng sẽ được lưu vào redis, ví dụ đối tượng Book:

package com.tvd12.example.spring_boot_redis.entity;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

@Getter
@Setter
@RedisHash("SpringBootRedis.Book")
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    @Id
    private Long id;
    private Long categoryId;
    private Long authorId;
    private String name;
    private BigDecimal price;
    private LocalDate releaseDate;
    private LocalDateTime releaseTime;
}

Tiếp theo chúng ta sẽ tạo ra lớp BookRepository để tương tác với Redis:

package com.tvd12.example.spring_boot_redis.repository;

import com.tvd12.example.spring_boot_redis.entity.Book;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {}

And finally we can use BookRepository like this:

package com.tvd12.example.spring_boot_redis.controller;

import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;

@AllArgsConstructor
@RestController
@RequestMapping("/api/v1")
public class BookController {

    private final BookRepository bookRepository;

    @PostMapping("/book/add")
    public BookResponse addBook(@RequestBody AddBookRequest request) {
        Book book = requestToEntityConverter.toBookEntity(request, bookId);
    }

    @GetMapping("/books/{bookId}")
    public BookResponse getBook(@PathVariable Long bookId) {
        Book book = bookRepository.findById(bookId)
            .orElseThrow(() ->
                new HttpNotFoundException("not found book with id: " + bookId)
            );
    }
}

For entire the example, you can find ou on the Github Repo.