- vừa được xem lúc

Hướng dẫn Spring Boot + Redis

0 0 50

Người đăng: Nguyen Hoang Nam

Theo Viblo Asia

Nguồn: loda.me

Giới thiệu

Redis là 1 hệ thống lưu trữ key-value in-memory rất mạnh mẽ và phổ biến hiện nay.

Redis nổi bật bởi việc hỗ trợ nhiều cấu trúc dữ liệu khác nhau (hash, list, set, sorted set, string), giúp việc thao tác với dữ liệu cực kì nhanh và thuận tiện.

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.

Cài đặt

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

pom.xml

<dependencies> <!--spring mvc, rest--> <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.

Cấu trúc thư mục bao gồm:

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ỉ hostport cho lettuce.

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

application.properties

redis.host=localhost
redis.port=6379

Sau đó, Tạo file RedisConfig.java để cấu hình mọi thứ liên quan tới Redis.


import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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() { // Tạo Standalone Connection tới Redis return new LettuceConnectionFactory(new RedisStandaloneConfiguration(redisHost, redisPort)); } @Bean @Primary public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { // tạo ra một RedisTemplate // Với Key là Object // Value là Object // RedisTemplate giúp chúng ta thao tác với Redis 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.

Đối tượng để thao tác với Redis chính là RedisTemplate.

Ở đâ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 RedisExample implements CommandLineRunner để chạy một ví dụ:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; @Component
public class RedisExample implements CommandLineRunner { @Autowired private RedisTemplate template; @Override public void run(String... args) throws Exception { // Set giá trị của key "loda" là "hello redis" template.opsForValue().set("loda","hello world"); // In ra màn hình Giá trị của key "loda" trong Redis System.out.println("Value of key loda: "+template.opsForValue().get("loda")); }
}

Chạy Spring App:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }
}

Khi chạy thử, màn hình sẽ in ra kết quả.

Value of key loda: hello world

Vậy là chúng ta đã kết nối thành công tới Redis và lưu một cặp key-value vào trong đó.

Redis operations

Quay trở lại ví dụ ở trên:

template.opsForValue().set("loda","hello world");

.opsForValue() được gọi là Redis Operations.

Spring Data hỗ trợ chúng ta thao tác với Redis thông qua các Operations như sau:

  1. opsForValue(): Kiểu Key-Value thông thường. Với Value là 1 giá trị String tùy ý.
  2. opsForHash(): Tương ứng với cấu trúc Hash trong Redis. Value là một Object có cấu trúc
  3. opsForList(): Tương ứng với cấu trúc List trong Redis. Value là một list.
  4. opsForSet(): Tương ứng với cấu trúc Set trong Redis.
  5. opsForZSet(): Tương ứng với cấu trúc ZSet trong Redis.

Ví dụ với List:

@Component
public class RedisExample implements CommandLineRunner { @Autowired private RedisTemplate template; @Override public void run(String... args) throws Exception { listExample(); } public void valueExample(){ // Set giá trị của key "loda" là "hello redis" template.opsForValue().set("loda","hello world"); // In ra màn hình Giá trị của key "loda" trong Redis System.out.println("Value of key loda: "+template.opsForValue().get("loda")); } public void listExample(){ // Tạo ra một list gồm 2 phần tử List<String> list = new ArrayList<>(); list.add("Hello"); list.add("redis"); // Set gia trị có key loda_list template.opsForList().rightPushAll("loda_list", list);
// template.opsForList().rightPushAll("loda_list", "hello", "world"); System.out.println("Size of key loda: "+template.opsForList().size("loda_list")); }
}

Kết quả in ra màn hình khi chạy:

Size of key loda: 2

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.

Như mọi khi, toàn bộ code mẫu đều được up tại GITHUB

<i class="fab fa-github"></i>

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 396

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 737

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 358

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 449

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 433