1. ภาพรวม
Memorystore สำหรับ Redis คือบริการ Redis ที่มีการจัดการครบวงจรสำหรับ Google Cloud แอปที่ทำงานบน Google Cloud จะมีประสิทธิภาพสูงมากได้โดยใช้ประโยชน์จากบริการ Redis ที่ปรับขนาดได้สูง พร้อมใช้งาน และปลอดภัยโดยไม่ต้องรับภาระในการจัดการการติดตั้งใช้งาน Redis ที่ซับซ้อน โดยสามารถใช้เป็นแบ็กเอนด์สำหรับการแคชข้อมูลเพื่อปรับปรุงประสิทธิภาพของแอป Spring Boot Codelab จะอธิบายวิธีตั้งค่า
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้ Memorystore เป็นแบ็กเอนด์แคชสำหรับแอป Spring Boot
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud
- เบราว์เซอร์ เช่น Google Chrome
- ความคุ้นเคยกับโปรแกรมแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, Emacs และ GNU Nano
คุณจะใช้ Codelab อย่างไร
คุณจะให้คะแนนประสบการณ์การใช้งานบริการของ Google Cloud เท่าไร
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เปิดใช้งาน Cloud Shell
- จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell
หากไม่เคยเริ่มใช้ Cloud Shell มาก่อน คุณจะเห็นหน้าจอระดับกลาง (ด้านล่าง) ที่อธิบายว่า Cloud Shell คืออะไร ในกรณีนี้ ให้คลิกต่อไป (และคุณจะไม่เห็นหน้าจอนี้อีก) หน้าจอแบบครั้งเดียวจะมีลักษณะดังนี้
การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน
เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานในโค้ดแล็บนี้ได้โดยใช้เพียงเบราว์เซอร์หรือ Chromebook
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์ของคุณแล้ว
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list
เอาต์พุตของคำสั่ง
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
เอาต์พุตของคำสั่ง
[core] project = <PROJECT_ID>
หากไม่ได้ตั้งค่าไว้ คุณตั้งค่าได้ด้วยคำสั่งนี้
gcloud config set project <PROJECT_ID>
เอาต์พุตของคำสั่ง
Updated property [core/project].
3. ตั้งค่าอินสแตนซ์ Memorystore สำหรับ Redis
เริ่มต้น Cloud Shell
หลังจากเปิดใช้ Cloud Shell แล้ว ให้ใช้บรรทัดคำสั่งเพื่อเปิดใช้ Memorystore API และสร้างอินสแตนซ์ Memorystore ใหม่
$ gcloud services enable redis.googleapis.com $ gcloud redis instances create myinstance --size=1 --region=us-central1
หลังจากดำเนินการเสร็จแล้ว อินสแตนซ์จะพร้อมใช้งาน
รับที่อยู่ IP ของโฮสต์ Redis ของอินสแตนซ์โดยเรียกใช้คำสั่งต่อไปนี้ คุณจะต้องใช้ข้อมูลนี้อีกครั้งในภายหลังเมื่อกำหนดค่าแอป Spring Boot
$ gcloud redis instances describe myinstance --region=us-central1 \ | grep host host: 10.0.0.4
ใน Google Cloud Console ให้ไปที่ฐานข้อมูล > Memorystore > Redis อินสแตนซ์ควรอยู่ในสถานะ "พร้อม" ดังนี้

4. ตั้งค่าอินสแตนซ์ Compute Engine
สร้างอินสแตนซ์ Compute Engine ในภูมิภาคเดียวกัน
$ gcloud compute instances create instance-1 --zone us-central1-c
หลังจากดำเนินการเสร็จแล้ว อินสแตนซ์จะพร้อมใช้งาน
เชื่อมต่อกับอินสแตนซ์ผ่าน SSH ด้วยคำสั่งต่อไปนี้
$ gcloud compute ssh instance-1 --zone us-central1-c
หรือไปที่ Compute > Compute Engine > อินสแตนซ์ VM แล้วคลิก SSH ในคอลัมน์เชื่อมต่อ

ในเชลล์อินสแตนซ์เครื่องเสมือน (VM) (ไม่ใช่ Cloud Shell) ให้ติดตั้งเครื่องมือ OpenJDK, Maven และ Redis โดยทำดังนี้
$ sudo apt-get install openjdk-17-jdk-headless maven redis-tools
รอให้การติดตั้งเสร็จสมบูรณ์ แล้วจึงทำขั้นตอนถัดไป
5. ตั้งค่าแอป Spring Boot
สร้างโปรเจ็กต์ Spring Boot ใหม่ที่มีการขึ้นต่อกันของ web, redis และ cache ดังนี้
$ curl https://start.spring.io/starter.tgz \ -d dependencies=web,redis,cache -d language=java -d baseDir=cache-app \ -d type=maven-project \ | tar -xzvf - && cd cache-app
แก้ไขไฟล์ application.properties เพื่อกำหนดค่าแอปให้ใช้ที่อยู่ IP ของอินสแตนซ์ Memorystore สำหรับโฮสต์ Redis
$ nano src/main/resources/application.properties
เพิ่มบรรทัดต่อไปนี้ด้วยที่อยู่ IP ของ Memorystore สำหรับ Redis (จาก 2 ขั้นตอนก่อนหน้า)
spring.data.redis.host=<memorystore-host-ip-address>
เพิ่มบรรทัดใหม่หลังจากนั้นและสร้างคลาส Java ของตัวควบคุม REST
$ nano src/main/java/com/example/demo/HelloWorldController.java
วางเนื้อหาต่อไปนี้ลงในไฟล์
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;
}
}
คำอธิบายประกอบ @RequestMapping จะแสดงเมธอดเป็นปลายทาง HTTP และแมปส่วนหนึ่งของเส้นทางกับพารามิเตอร์เมธอด (ตามที่ระบุโดยคำอธิบายประกอบ @PathVariable)
@Cacheable("hello") หมายเหตุระบุว่าควรแคชการเรียกใช้เมธอดและชื่อแคชคือ "hello" โดยใช้ร่วมกับค่าพารามิเตอร์เป็นคีย์แคช คุณจะเห็นตัวอย่างในโค้ดแล็บในภายหลัง
จากนั้นเราจะเปิดใช้การแคชในคลาสแอป Spring Boot แก้ไข DemoApplication.java:
$ nano src/main/java/com/example/demo/DemoApplication.java
นำเข้า org.springframework.cache.annotation.EnableCaching และใส่คำอธิบายประกอบในชั้นเรียนด้วยคำอธิบายประกอบนี้ ผลลัพธ์ควรมีลักษณะดังนี้
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);
}
}
6. เรียกใช้แอปและเข้าถึงปลายทาง
ตรวจสอบว่าได้ตั้งค่า JAVA_HOME เป็นเวอร์ชันที่ถูกต้อง
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
ตอนนี้คุณก็พร้อมที่จะเรียกใช้แอปแล้ว
$ mvn spring-boot:run
เปิดการเชื่อมต่อ SSH อื่นกับอินสแตนซ์ในลักษณะเดียวกับที่คุณทำก่อนหน้านี้ ในหน้าต่าง SSH ใหม่ ให้เข้าถึงปลายทาง /hello/ หลายครั้งโดยส่ง "bob" เป็นชื่อ
$ 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
โปรดสังเกตว่าคำขอครั้งแรกใช้เวลา 5 วินาที แต่คำขอครั้งถัดไปเร็วกว่ามากแม้ว่าคุณจะมีการเรียกใช้ Thread.sleep(5000) ในเมธอดก็ตาม เนื่องจากระบบจะเรียกใช้วิธีการจริงเพียงครั้งเดียวและนำผลลัพธ์ไปใส่ไว้ในแคช การเรียกใช้ครั้งต่อๆ ไปจะแสดงผลลัพธ์จากแคชโดยตรง
7. ตรวจสอบออบเจ็กต์ที่แคช
คุณจะเห็นสิ่งที่แอปแคชไว้ได้อย่างชัดเจน จากเทอร์มินัลเดียวกันกับที่ใช้ในขั้นตอนก่อนหน้า ให้เชื่อมต่อกับโฮสต์ Memorystore for Redis โดยใช้ redis-cli ดังนี้
$ redis-cli -h <memorystore-host-ip-address>
หากต้องการดูรายการคีย์แคช ให้ใช้คำสั่งต่อไปนี้
:6379> KEYS * 1) "hello::bob"
ดังที่เห็นได้ว่า ระบบใช้ชื่อแคชเป็นคำนำหน้าสำหรับคีย์ และใช้ค่าพารามิเตอร์เป็นส่วนที่ 2
หากต้องการเรียกข้อมูลค่า ให้ใช้คำสั่ง GET
:6379> GET hello::bob Hello bob!
ใช้คำสั่ง exit เพื่อออก
8. ล้างข้อมูล
หากต้องการล้างข้อมูล ให้ลบอินสแตนซ์ Compute Engine และ Memorystore ออกจาก Cloud Shell
ลบอินสแตนซ์ Compute โดยทำดังนี้
$ gcloud compute instances delete instance-1 --zone us-central1-c
ลบอินสแตนซ์ Memorystore สำหรับ Redis โดยทำดังนี้
$ gcloud redis instances delete myinstance --region=us-central1
9. ยินดีด้วย
คุณได้สร้าง Memorystore สำหรับ Redis และอินสแตนซ์ Compute Engine นอกจากนี้ คุณยังกำหนดค่าแอป Spring Boot ให้ใช้ Memorystore กับ Spring Boot Caching ได้ด้วย
ดูข้อมูลเพิ่มเติม
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป