การสร้าง Distributed Cached ด้วย Redis
Redis ใช้ทำอะไร?
Redis ถือได้ว่าเป็น In-memory database ที่ถูกนำมาใช้ทำ distributed cache มากที่สุด ในบทความนี้จะพาคุณไปรู้จักกับ Redis เบื้องต้น ก่อนจะไปรู้จักกับ Redis ผมจะพาไปรู้จักกับ Distributed Cached กันก่อนเพื่อความเข้าใจ
Distributed Cache คือ Cache ที่แชร์ให้กับ applications หรือ services ใช้ร่วมกัน ใช้ใน application ที่ host บน cloud services หรือ server farm
ใน microservices เราจะให้ services ต่างๆใช้ cache ร่วมกัน เพื่อให้ได้ประโยชน์ต่างๆเหล่านี้
- ลดปริมาณ traffic เนื่องจากใน microservices จะมี communications เยอะมาก
- ช่วยเพิ่มประสิทธิภาพให้กับระบบ เพราะดึงข้อมูลจาก cache เร็วกว่า database แน่นอน
- ช่วยเพิ่ม resilience ให้กับระบบ เพราะถ้า services ต้นทางตายก็สามารถไปดึงข้อมูลจาก cache ออกมาใช้ก่อนได้
Redis Modules
redis ไม่ได้มีดีแค่การเป็น in-memory database เท่านั้น แต่ยังสามารถเพิ่มความสามารถอื่นๆ ให้กับ redis ได้ด้วยการคิดคั้ง module เพิ่มเข้าไป ซึ่งจะทำให้ redis กลายเป็น database ประเภทอื่นๆได้ด้วย ซึ่งจะทำให้ redis สามารถทำ polyglot persistence(เลือกใช้ database หลายๆแบบ เพื่อให้เหมาะกับประเภทของข้อมูล) ได้ซึ่ง module ที่น่าในใจของ redis มีดังนี้
- RedisSearch ทำ Full-text search เหมือน elastic search
- RedisJSON เก็บและ query ข้อมูลแบบ JSON ได้ง่ายและรวดเร็วมากๆ
- RedisGraph เก็บและสร้างความสัมพันธ์(edges)ให้กับแต่ละ nodes เหมือนกับ Neo4J
- RedisTimeSeries เก็บข้อมูลโดยใช้ Index เป็นเวลา เหมือนกับ InfluxDB หรือ Prometheus
- RedisQL เปลี่ยนจาก NoSQL ให้กลายเป็น Relational Database(RDBMS) เพื่อจัดการ transactions
จะเห็นว่า redis เองนั้นสามารถแปลงตัวเองให้กลายเป็น database แบบต่างๆได้เยอะมาก รวมทั้ง redis ที่เป็น In-memory database นั้นสามารถ backup ข้อมูลลง disk ได้ด้วยการ set append only file(aof) หรือ Redis Database(RDB)
Redis Persistence
เราสามารถ config redis(แก้ไฟล์ redis.conf) ให้เก็บข้อมูลลงใน disk ได้ ด้วย 4 วิธีนี้
-
RDB (Redis Database): RDB persistence จะทำการ snapshots เหมือนกับใน database ทั่วไปแต่จะสามารถกำหนดเป็นจำนวน operation ได้ เช่น
save 3600 1 300 100 60 10000 10 100000
ในตัวอย่างนี้จะเป็นกำหนดว่า ถ้ามี key changes(ข้อมูลมีการเปลี่ยนแปลง) มากกว่า 100,000 ให้ snapshort ทุกๆ 10 วินาที แต่ถ้ามี key changes น้อยกว่า 100,000 แต่มากกว่า 10,000 ให้ snapshort ทุกๆ 60 วินาที ไล่ตามเงื่อนไขนี้ไปเรื่อยๆจนจบ
-
AOF (Append Only File): AOF persistence จะเป็นการเก็บ logs ของการ write operation ไว้ด้วย format ของ redis เองซึ่งจะสามารถมีนามสกุล .aof เราสามารถเปิด feature นี้ด้วยการ set ใน redis.conf ตามนี้
appendonly yes appendfilename "appendonly.aof"
-
No persistence: ถ้าต้องการให้ redis ทำหน้าที่เป็นแค่ caching เท่านั้นให้ปิด Append Only File(AOF) และ Redis Database(RDB)
-
RDB + AOF: คุณสามารถเลือกเปิดทั้ง Append Only File(AOF) และ Redis Database(RDB) พร้อมกันได้เลย redis จะเก็บ Logs ลงใน AOF แค่ Operation ที่ยังไม่ได้ถูก Snapshort ไว้เท่านั้น
การติดตั้ง Redis Server ด้วย docker
เราสามารถนำ redis มาใช้งานในเครื่องได้ด้วยคำสั่งนี้
docker run -p 6379:6379 --rm redis redis-server
คำสั่งนี้จะเป็นการตั้ง redis server ขึ่้นมา โดย redis จะใช้ port 6379 ในการสื่อสาร
จัดการ Redis ผ่านทาง Command Line
การเชื่อมต่อกับ redis server เราจะใช้ redis cli ซึ่งจะใช้วิธีการ Download จากที่นี่ได้เลย ซึ่งการใข้งานบน Windows นั้นต้องใช้ run redis-cli ผ่านทาง WSL เท่านั้น จึงทำให้การใช้งานไม่ค่อยสะดวกเท่าไหร่นักในบมความนี้ ผมเลยเลือกใช้ redis-cli ผ่านทาง docker ซึ่งจะง่ายกว่ามาก
docker run -it --rm redis redis-cli -h host.docker.internal
เนื่องจาก container 2 ตัวนี้่ไม่ได้สร้างบน network เดียวกัน ทำให้เราต้อง connect เข้าไปที่ redis server โดยใช้ host.docker.internal แต่ถ้าคุณนำไปสร้างด้วย docker-compose ก็จะต้องอ้าง host ด้วยชื่อ service ใน docker-compose แทน
หลังจากนั้น เราจะเข้าสู่ shell ของ redis ซึ่งเราจะทำการ check ก่อนว่า redis-server นั้นพร้อมใช้งานหรือไม่ด้วยคำสั่ง PING ถ้า redis server ตอบ PONG กลับมาแสดงว่าใช้ได้
redis host.local.internal:6379> ping
PONG
หรือจะเรียกผ่าน redis-cli ตรงๆ แบบนี้ก็ได้
$ redis-cli ping
PONG
จัดการ Redis ผ่าน GUI ด้วย RedisInsight
เราสามารถเลือกจัดการกับ Redis server ผ่านทาง UI ด้วย RedisInsight ซึ่งสามารถ Download ได้จากที่นี่ โดยที่ RedisInsight จะมี feature หลักๆ ดังนี้
- สามารถค้นหาและ filter ข้อมูลใน redis ได้
- แสดง keys ต่างๆที่อยู่ใน redis ออกมาให้คุณเห็นได้ง่าย
- ข้อมูลที่ออกมาเป็น JSON จะถูกจัด format ให้สวยงาม
- ใมี tree view เพื่อให้เห็น group ของข้อมูลอย่างชัดเจน