Lưu dữ liệu vào bộ nhớ đệm từ ứng dụng Spring Boot bằng Memorystore

Memorystore for Redis là một dịch vụ Redis được quản lý toàn diện cho Google Cloud. Các ứng dụng chạy trên Google Cloud có thể đạt được hiệu suất cực cao bằng cách tận dụng dịch vụ Redis có khả năng mở rộng, tính khả dụng và tính bảo mật cao mà không phải chịu gánh nặng quản lý các hoạt động triển khai Redis phức tạp. Bạn có thể dùng Redis làm một phần phụ trợ để lưu dữ liệu vào bộ nhớ đệm nhằm cải thiện hiệu suất của các ứng dụng Spring Boot. Lớp học lập trình này giải thích cách thiết lập.

Kiến thức bạn sẽ học được

  • Cách sử dụng Memorystore làm phụ trợ bộ nhớ đệm cho ứng dụng Spring Boot.

Bạn cần có

  • Một dự án trên Google Cloud
  • Một trình duyệt, chẳng hạn như Google Chrome
  • Làm quen với các trình chỉnh sửa văn bản tiêu chuẩn của Linux, chẳng hạn như Vim, Emacs và GNU Nano

Bạn sẽ sử dụng lớp học lập trình này như thế nào?

Chỉ đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm của mình khi sử dụng các dịch vụ của Google Cloud?

Người mới bắt đầu Trung cấp Thành thạo

Thiết lập môi trường theo tốc độ của riêng bạn

Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform (console.cloud.google.com) rồi tạo một dự án mới:

Ảnh chụp màn hình từ 2016-02-10 12:45:26.png

Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.

Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.

Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó chạy (xem phần "dọn dẹp" ở cuối tài liệu này).

Người dùng mới của Google Cloud Platform đủ điều kiện dùng thử miễn phí 300 USD.

Kích hoạt Google Cloud Shell

Trên Bảng điều khiển GCP, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:

Sau đó, hãy nhấp vào "Start Cloud Shell" (Bắt đầu Cloud Shell):

Quá trình cung cấp và kết nối với môi trường chỉ mất vài phút:

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong phòng thí nghiệm này chỉ bằng một trình duyệt hoặc Google Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành PROJECT_ID.

Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:

gcloud auth list

Đầu ra của lệnh

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

Khởi động Cloud Shell.

Sau khi Cloud Shell khởi động, bạn có thể dùng dòng lệnh để tạo một phiên bản Memorystore mới.

$ gcloud redis instances create myinstance --size=1 --region=us-central1

Nếu chưa bật Memorystore API, thì bạn sẽ được hỏi xem bạn có muốn bật API này hay không. Trả lời y.

API [redis.googleapis.com] not enabled on project [204466653457].
Would you like to enable and retry (this will take a few minutes)?
(y/N)?  y
Enabling service redis.googleapis.com on project 204166153457...
Waiting for async operation operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416 to complete...
Operation finished successfully. The following command can describe the Operation details:
 gcloud services operations describe operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416
Create request issued for: [myinstance]
Waiting for operation [operation-1538645026454-57763b937ad39-2564ab37-3fea7701] to complete...done.
Created instance [myinstance].

Sau khi hoàn tất thao tác, bạn có thể sử dụng phiên bản của mình.

Lấy địa chỉ IP máy chủ lưu trữ redis của phiên bản bằng cách chạy lệnh sau. Bạn sẽ sử dụng lại khoá này sau khi định cấu hình ứng dụng Spring Boot.

$ gcloud redis instances describe myinstance --region=us-central1 \
  | grep host
host: 10.0.0.4

Nếu chuyển đến Bộ nhớ > Memorystore trong Google Cloud Console, bạn sẽ thấy phiên bản của mình ở trạng thái "sẵn sàng":

Tạo một phiên bản Compute Engine ở cùng khu vực.

$ gcloud compute instances create instance-1 --zone us-central1-c

Sau khi hoàn tất thao tác, bạn có thể sử dụng phiên bản của mình.

Kết nối với phiên bản của bạn qua SSH bằng cách chuyển đến Compute > Compute Engine > VM instances (Phiên bản máy ảo), rồi nhấp vào SSH trong cột Connect (Kết nối):

Trong trình bao của phiên bản máy ảo (VM) (không phải Cloud Shell), hãy cài đặt OpenJDK, Maven, telnet:

$ sudo apt-get install openjdk-8-jdk-headless maven telnet

Vui lòng chờ quá trình cài đặt hoàn tất rồi chuyển sang bước tiếp theo.

Tạo một dự án Spring Boot mới có các phần phụ thuộc web, rediscache:

$ curl https://start.spring.io/starter.tgz \
  -d dependencies=web,redis,cache -d language=java -d baseDir=cache-app \
  | tar -xzvf - && cd cache-app

Chỉnh sửa tệp application.properties để định cấu hình ứng dụng sử dụng địa chỉ IP của phiên bản Memorystore cho máy chủ lưu trữ Redis.

$ nano src/main/resources/application.properties

Thêm dòng sau đây bằng địa chỉ IP Memorystore cho Redis (từ một vài bước trước):

spring.redis.host=<memorystore-host-ip-address> 

Thêm một dòng mới sau đó và tạo một lớp Java của trình điều khiển REST:

$ nano src/main/java/com/example/demo/HelloWorldController.java

Đưa nội dung sau vào tệp:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
@Autowired
private StringRedisTemplate template;

@RequestMapping("/hello/{name}")
@Cacheable("hello")
public String hello(@PathVariable String name) throws InterruptedException {
  Thread.sleep(5000);
  return "Hello " + name;
 }
}

Chú giải @RequestMapping hiển thị phương thức dưới dạng một điểm cuối HTTP và ánh xạ một phần của đường dẫn đến một tham số phương thức (như được chỉ ra bằng chú giải @PathVariable).

Chú thích @Cacheable("hello") cho biết quá trình thực thi phương thức phải được lưu vào bộ nhớ đệm và tên bộ nhớ đệm là "hello". Chú thích này được dùng kết hợp với giá trị tham số làm khoá bộ nhớ đệm. Bạn sẽ thấy ví dụ về việc này ở phần sau của lớp học lập trình.

Ngoài ra, bạn cần bật tính năng lưu vào bộ nhớ đệm trong lớp ứng dụng Spring Boot.

Chỉnh sửa DemoApplication.java:

$ nano src/main/java/com/example/demo/DemoApplication.java

Nhập org.springframework.cache.annotation.EnableCaching và chú giải lớp bằng chú giải này. Kết quả sẽ có dạng như sau:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class DemoApplication {

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

Giờ thì bạn đã sẵn sàng chạy ứng dụng!

$ mvn spring-boot:run

Mở một kết nối SSH khác đến phiên bản của bạn theo cách mà bạn đã làm trước đó. Trong cửa sổ SSH mới, hãy truy cập vào điểm cuối /hello/ nhiều lần, truyền "bob" làm tên.

$ time curl http://localhost:8080/hello/bob 
Hello bob!

real        0m5.408s
user        0m0.036s
sys        0m0.009s

$ time curl http://localhost:8080/hello/bob 
Hello bob!

real        0m0.092s
user        0m0.021s
sys        0m0.027s

Lưu ý rằng lần đầu tiên yêu cầu mất 5 giây, nhưng lần tiếp theo nhanh hơn đáng kể mặc dù bạn có lệnh gọi Thread.sleep(5000) trong phương thức. Đó là vì phương thức thực tế chỉ được thực thi một lần và kết quả được đưa vào bộ nhớ đệm. Mọi lệnh gọi tiếp theo đều trả về kết quả trực tiếp từ bộ nhớ đệm.

Bạn có thể xem chính xác nội dung mà ứng dụng đã lưu vào bộ nhớ đệm. Từ cùng một thiết bị đầu cuối mà bạn đã sử dụng ở bước trước, hãy kết nối với máy chủ lưu trữ Memorystore cho Redis bằng telnet:

$ telnet <memorystore-host-ip-address> 6379

Để xem danh sách các khoá lưu vào bộ nhớ đệm, hãy dùng lệnh sau:

KEYS *
hello::bob

Như bạn có thể thấy, tên bộ nhớ đệm được dùng làm tiền tố cho khoá và giá trị tham số được dùng làm phần thứ hai.

Để truy xuất giá trị, hãy dùng lệnh GET:

$ GET hello::bob
   Hello bob!

Sử dụng lệnh QUIT để thoát.

Để dọn dẹp, hãy xoá các phiên bản Compute Engine và Memorystore khỏi Cloud Shell.

Xoá phiên bản điện toán:

$ gcloud compute instances delete instance-1 --zone us-central1-c

Xoá phiên bản Memorystore for Redis:

$ gcloud redis instances delete myinstance --region=us-central1

Bạn đã tạo Memorystore cho Redis và một phiên bản Compute Engine. Ngoài ra, bạn đã định cấu hình một ứng dụng Spring Boot để sử dụng Memorystore với tính năng lưu vào bộ nhớ đệm Spring Boot!

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả theo Creative Commons 2.0.