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:
<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
redis:
host: "localhost"
port: "6379"
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
.