Redis Pub/Sub กับ Spring boot
ช่วงนี้ได้มีโอกาสทำความรุ้จักกับ database ตัวนึงที่ชื่อว่า Redis ซึ่งน่าสนใจมากๆ ในหลายๆอย่าง ซึ่งคงมีโอกาสได้เขียนเรื่องราวของมันอีกแน่
แต่วันนี้จะขอบันทึกหนึ่งความสามารถที่น่าสนใจมากๆ ของ Redis นั้นคือ Pub/Sub
PUBLISH/SUBSCRIBE
คือการส่ง message(publish) ออกไป และผู้รับที่ฟังข้อความนั้นอยู่ (subscribe )ก็จะได้รับข้อความนั้น
ใน redis นั้นสามารถทำ pub/sub ได้ค้อนข้างง่าย มาเริ่มทำกันเลย
เริ่มจากลง redis ก่อน ใครใช้ mac ก็ตามนี้
brew install redis
ต่อมาพิมคำสั่งนี้เพื่อเปิด server redis
redis-server
เปิด terminal อีก tab แล้วพิมพ์
redis-cli // เปิดการทำงานของ cli
หลังจากนั้น เริ่ม SUBSCRIBE
กัน
พิมพ์คำสั่ง SUBSCRIBE [channel ที่ต้องการติดตาม] [channel ที่ต้องการติดตาม2]
จากรูปจะเห็นว่าตอนนี้ได้ทำการ sub ที่ชื่อ testMessage1
ซึ่งสามารถติดตามได้มากกว่า 1 channel โดยการพิมพ์ channel และ เว้นวรรคไปเรื่อยๆ
ทีนี้ลอง เปิด cli มาอีก tab ( อย่าเพิ่งปิดอันแรกนะ )
แล้วลองพิมพ์ตามนี้
PUBLISH [channel ที่ต้องการส่ง] [ข้อความ]
ทีนี้ลองมาเปิดที่ cli อันแรกดู
จะเห็นได้ว่าตอนนี้ข้อความได้ถูกส่งมาแล้ว
ถ้าเราลอง pub ไปที่ channel testMessage3 ซึ่งไม่มีใคร sub อยู่เลย ถ้าเรามาเปิดที่ cli แรกก็จะไม่พบอะไร
ทีนี้มาลองสร้าง Demo เล่นๆกัน โดยผมเลือกใช้ spring boot เนื่องจากมี spring-data-redis ทำให้สามารถ connect กับ redis ได้ง่ายไม่ยุ่งยากเลย
เริ่มจากเพิ่ง lib ใน gradle ดังนี้
compile("org.springframework.boot:spring-boot-starter")
compile("org.springframework.boot:spring-boot-starter-data-redis")
จากนั้นสร้าง Main Class
สร้าง Class Receiver เป็น มี method ที่เมื่อได้รับ message แล้วจะไปทำอะไร
จากนั้นสร้าง Class config สำหรับ redis
อธิบายคร่าวๆ
listenerAdapter, new PatternTopic(“testMessage1”);
// คือบอกว่าเราจะ sub channel ที่ชื่อว่าอะไร
MessageListenerAdapter(receiver, "receiveMessage");
// คือเมื่อได้รับข้อความแล้วให้ไปที่ class receiver แล้วไปที่ method receiveMessage
ที่นี้ลองรันเลยยยยยย
ไปที่ terminal เปิด redis-cli ขึ้นมาแล้วลองพิมพ์
PUBLISH testMessage1 "Hello HOI"
เมื่อกลับไปดู console ที่ java จะเห็น log ดังภาพ
จะเห็นได้ว่าเราได้รับข้อความแล้ว
ที่ลองเปลี่ยน Pattern เป็น
new PatternTopic("testMessage*")
แล้วลองรันใหม่ แล้วกลับไปที่ cli แล้วพิมพ์ดังนี้
PUBLISH testMessage2 "Hello Redis"
PUBLISH testMessage2 "Hello I am your father"
ที่ java เราจะได้รับข้อความดังนี้
หมายความว่า ตรง PatternTopic เราสามารถใส่เป็น Regex ได้เลยนะครัช
ที่มา : redis , spring-redis