Redis Pub/Sub กับ Spring boot

TheHoiStory
3 min readJun 15, 2017

--

ช่วงนี้ได้มีโอกาสทำความรุ้จักกับ 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

--

--

TheHoiStory

Dev กากๆ ชอบลองอะไรไปเรื่อย ไม่มีคนคุยด้วยเลยมาเขียนแทน FB page : เดอะห้อยแมน