Hướng dẫn sử dụng Redis + Spring Boot

Các hệ thống ngày nay luôn tìm cách tối ưu performance và Redis gần như là một mảnh ghép không thể thiếu trong đó. Hôm nay chúng ta sẽ cùng tìm hiểu cách kết nối ứng dụng Spring Boot với Redis.

Ưu và nhược điểm của Redis là gì?

Redis hiện đang được tin dùng bởi hơn 5000 công ty trên toàn thế giới, trong đó có cả nhiều ông lớn như Snapchat, Twitter, Slack, Uber, Airbnb và Pinterest. Vậy ưu và nhược điểm của Redis là gì? Có nên xem Redis là giải pháp duy nhất hay không?

Điểm mạnh của Redis

  • Tốc độ cực nhanh.
  • Dễ thiết lập và sử dụng.
  • Hỗ trợ nhiều cấu trúc dữ liệu linh hoạt.
  • Cho phép lưu trữ các cặp key-value với kích thước lên đến 512MB.
  • Sử dụng cơ chế hash riêng (Redis Hashing).
  • Không bị downtime và ảnh hưởng hiệu suất khi thay đổi quy mô.
  • Mã nguồn mở, ổn định.
  • Hỗ trợ nhiều ngôn ngữ khác nhau: Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go,…

Điểm yếu

  • Dữ liệu được chia sẻ dựa trên các vị trí hash gán cho từng Master. Vì vậy nếu Master đang giữ slot gặp trục trặc, dữ liệu trong slot đó cũng sẽ bị mất.
  • Client kết nối đến các cluster Redis nên chú ý đến cấu trúc liên kết cụm.
  • Khi sử dụng Redis cần nhiều RAM vì cơ chế in-memory.

Config redis và Spring boot

Cài đặt

Chúng ta sử dụng Maven, và yêu cầu các dependencies sau:

Java
<dependencies>

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

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

    <dependency>
      <groupId>io.lettuce</groupId>
      <artifactId>lettuce-core</artifactId>
      <version>5.1.3.RELEASE</version>
    </dependency>
</dependencies>

Trong đó, spring-data-redis là thư viện của Spring giúp chúng ta thao tác với Redis dễ dàng hơn.

Còn lettuce-core là một thư viện mã nguồn mở, giúp kết nối tới Redis một cách thread-safe bằng nhiều hình thức như synchronous, asynchronous and reactive usage.

Trong bài này chúng ta sẽ cấu hình cho spring-data-redis sử dụng lettuce kết nối tới Redis. Còn chi tiết về letture sẽ được đề cập ở một bài viết khác.

Implement

Cấu hình Redis

Bài viết giả định bạn đã cài đặt Redis, để kết nối tới Redis, bạn cần cung cấp địa chỉ host và port cho lettuce.

Cách dễ nhất là ghi nó ở file application.properties trong thư mục resources:

application.properties

Java
redis:
  host: "localhost"
  port: "6379"
Java
package com.renwei.uz.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

@Configuration
public class RedisConfig {

    @Value("${redis.host}")
    private String redisHost;

    @Value("${redis.port}")
    private int redisPort;

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration(redisHost, redisPort));
    }

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

Chúng ta cần sử dụng lettuce để kết nối tới Redis, nên tôi tạo ra bean LettuceConnectionFactory và Spring Data sẽ tự động nhận vào cấu hình của mình.

Trong ví dụ này, chúng ta làm việc với Redis Standalone RedisStandaloneConfiguration. Còn nếu bạn muốn cấu hình với Redis Cluster thì cũng tương tự bằng class RedisClusterConfiguration.

Ở đây tôi cấu hình cho RedisTemplate nhận key là Object và value cũng là Object luôn. Để chúng ta có thể lưu bất kỳ key-value nào xuống Redis.

Chạy thử

Chúng ta tạo ra một class distancePlace2Place implements CommandLineRunner để chạy một ví dụ lưu lại thông tin tìm kiếm địa chỉ trên gg map tránh việc call api gg map nhiều làm phát sinh chi phí:

Lấy dữ liệu từ redis dựa trên key from-to

Put dữ liệu lên redis

Kết

Tới đây các bạn có thể dễ dàng thao tác với các kiểu cấu trúc trong Redis thông qua RedisTemplate.

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like